Итак, у меня есть следующие строки:
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()), чтобы оно могло работать без сбоев?
В опубликованном вами коде нет условной привязки.
И никогда не используйте String(describing:)
ни для чего, кроме вывода отладки. Никогда не используйте его, чтобы показать значение пользователю.
@rmaddy почему это?
Потому что его результат не задокументирован, и он делает такие вещи, как добавление Optional(...)
к тексту. Вы не хотите показывать это пользователю. Правильно обрабатывайте необязательные параметры вместо того, чтобы делать неуместные вещи, такие как интерполяция строк String(describing:)
.
@rmaddy Ах, это было корнем стольких проблем... Спасибо, я запомню это!
Пытаться
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 имеет значение...
Перед оператором if попробуйте print(username.text)
проверить, произойдет ли сбой или нет
username.text = selectedPost?.user.username ?? "по умолчанию" дал ту же ошибку. И вывод оператора печати: Тема 1: Неустранимая ошибка: неожиданно найдено nil при неявном развертывании необязательного значения
Тогда нет никакой возможности, чтобы выход вашего имени пользователя не был подключен, убедитесь, что он подключен к этому vc, попробуйте отключить и снова подключиться к этому активному vc, возможно, вы назначаете vc многим сценам
Я обновил вопрос. Я также сделаю то, что вы только что рекомендовали
если не сработало, покажите, как вы создаете экземпляр этого vc
Я снова подключился, и произошло то же самое, я попытаюсь воссоздать его.
Я перехожу к этому классу, используя метод подготовки для передачи данных, таких как идентификатор пользователя и объект Post.
внутри класса Phase3VC я пишу приведенный выше код.
функция viewDidLoad
?? или что
Нет внутри метода: loadP3Data(), который вызывается в: var selectedPost: Post? { didSet { getMediaStats() loadP3Data() } } .
Даже если вы используете !
вместо 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"
У вас еще есть силы развернуться там - The ! в конце. Это приведет к сбою, если
username
равноnil
, даже еслиselectedPost
нет. Вам нужно условно развернуть все - например.if let post = selectedPost, let username = post.user.username { ..