Я столкнулся с нечетным случаем при попытке проверить возвращаемое значение, и мне интересно, как это сделать "правильно" в смысле Swift.
У меня есть NSStatusItem (named item), и я пытаюсь назначить NSStatusItem a NSImage. Когда я делаю NSImage, так как я передаю ему строковое значение для имени изображения, я хочу убедиться, что значение NSImage действительно допустимо (что, если я ошибочно назову строку имени изображения?).
Первое, что я пробовал, это:
if let image: NSImage? = NSImage(named: "CorrectIconName") {
item.image = image
}
Но это дает ошибку "Связанное значение в условной привязке должно быть необязательного типа". Я подумал, что говоря image: NSImage? дал понять, что это необязательно, но я не думаю.
Я изменил это на следующее:
let image: NSImage? = NSImage(named: "CorrectIconName")
if image {
item.image = image
}
Это работает отлично. Но я не понимаю, почему это работает, а в первом примере этого нет. Кажется более или менее точной. А так как первый не компилировался, я думал, что попробую другие маршруты...
Так как NSImage(named:) возвращает NSImage, а не NSImage?, я думал, что увижу, что произошло, если я назначил возвращаемое значение конструктора непосредственно item:
item.image = NSImage(named: "CorrectIconName")
Что работает, но не позволяет проверить ошибку, которую я хочу сделать. Если строка неверна, NSStatusItem получает nil для изображения, что приводит к тому, что у меня есть элемент невидимой строки состояния.
Далее я пробовал это:
let image: NSImage = NSImage(named: "CorrectIconName")
if image {
item.image = image
}
Но это дает ошибку "Тип" NSImage "не подтверждает протокол" LogicValue ", который, я думаю, означает, что вам не разрешено проверять, не является ли оно nil или нет с помощью оператора if.
Однако вы можете проверить, является ли это nil, выполнив следующие действия:
let image: NSImage = NSImage(named: "CorrectIconName")
if image != nil {
item.image = image
}
Итак, вот вопрос: как точно следует проверять возвращаемое значение, если оно необязательно?