Неожиданно найдено nil при неявном развертывании необязательного значения, несмотря на условную привязку

Итак, у меня есть следующие строки:

let theUsername = "\(String(describing: selectedPost?.user.username!))"

if selectedPost?.user.username! != nil {
    print("Contains a value!")
    username.text = theUsername//Fails here 
} else {
    print("Doesn’t contain a value.")
    username.text = "No username found: Weird"
}

Сообщение об ошибке:

Unexpectedly found nil while implicitly unwrapping an Optional value

заставило бы думать, что значение внутри равно нулю. Однако при печати:

print("\(String(describing: selectedPost?.user.username!))", " LIT555")

Я получил:

Optional("C22AE009-8CC6-490A-9328-23A08AAD3A10") LIT555

Как я могу превратить значение в необязательное (т.е. избавиться от части Optional()), чтобы оно могло работать без сбоев?

У вас еще есть силы развернуться там - The ! в конце. Это приведет к сбою, если username равно nil, даже если selectedPost нет. Вам нужно условно развернуть все - например. if let post = selectedPost, let username = post.user.username { ..

Paulw11 10.04.2019 01:22

В опубликованном вами коде нет условной привязки.

rmaddy 10.04.2019 01:25

И никогда не используйте String(describing:) ни для чего, кроме вывода отладки. Никогда не используйте его, чтобы показать значение пользователю.

rmaddy 10.04.2019 01:26

@rmaddy почему это?

user11182249 10.04.2019 01:28

Потому что его результат не задокументирован, и он делает такие вещи, как добавление Optional(...) к тексту. Вы не хотите показывать это пользователю. Правильно обрабатывайте необязательные параметры вместо того, чтобы делать неуместные вещи, такие как интерполяция строк String(describing:).

rmaddy 10.04.2019 01:35

@rmaddy Ах, это было корнем стольких проблем... Спасибо, я запомню это!

user11182249 10.04.2019 01:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
10 752
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Пытаться

if let res = selectedPost?.user.username { // to unwrap the optional value 
  // check textfield is not nil
    username.text = res
}
else {
    username.text = "default"
}

Или в ближайшее время

username.text = selectedPost?.user.username ?? "default"

Согласно сбою, ваше текстовое поле равно нулю, проверьте соединение с IB


Когда ты это сделаешь

var selectedPost : Post? { didSet { getMediaStats() loadP3Data() } } 

и присвойте значение selectedPost в методе prepare предыдущего vc, целевые выходы vc по-прежнему равны нулю, потому что он еще не загружен, и поскольку didSet вызывается непосредственно перед загрузкой, отсюда и сбой

Так что уберите didSet и назовите то, что внутри, viewDidLoad

Подключено только что проверил. Я все еще получаю Thread 1: Неустранимая ошибка: Неожиданно найдено nil при неявном развертывании необязательного значения. Несмотря на то, что res имеет значение...

user11182249 10.04.2019 01:27

Перед оператором if попробуйте print(username.text) проверить, произойдет ли сбой или нет

Sh_Khan 10.04.2019 01:30

username.text = selectedPost?.user.username ?? "по умолчанию" дал ту же ошибку. И вывод оператора печати: Тема 1: Неустранимая ошибка: неожиданно найдено nil при неявном развертывании необязательного значения

user11182249 10.04.2019 01:32

Тогда нет никакой возможности, чтобы выход вашего имени пользователя не был подключен, убедитесь, что он подключен к этому vc, попробуйте отключить и снова подключиться к этому активному vc, возможно, вы назначаете vc многим сценам

Sh_Khan 10.04.2019 01:33

Я обновил вопрос. Я также сделаю то, что вы только что рекомендовали

user11182249 10.04.2019 01:35

если не сработало, покажите, как вы создаете экземпляр этого vc

Sh_Khan 10.04.2019 01:38

Я снова подключился, и произошло то же самое, я попытаюсь воссоздать его.

user11182249 10.04.2019 01:39

Я перехожу к этому классу, используя метод подготовки для передачи данных, таких как идентификатор пользователя и объект Post.

user11182249 10.04.2019 01:42

внутри класса Phase3VC я пишу приведенный выше код.

user11182249 10.04.2019 01:46

функция viewDidLoad ?? или что

Sh_Khan 10.04.2019 01:47

Нет внутри метода: loadP3Data(), который вызывается в: var selectedPost: Post? { didSet { getMediaStats() loadP3Data() } } .

user11182249 10.04.2019 01:53

Даже если вы используете ! вместо username, это выражение по-прежнему необязательно, потому что у вас есть ? в selectedPost. Я настоятельно рекомендую вам никогда не использовать принудительную развертку (!), всегда используйте if let или guard let, чтобы убедиться, что вы можете развернуть необязательный элемент и избежать этих сбоев.

Вот как может выглядеть ваш код:

if let theUsername = selectedPost?.user.username {
    username.text = theUsername
} else {
    username.text = "No username found: Weird"
}

или

username.text = selectedPost?.user.username ?? "No username found: Weird"

Другие вопросы по теме