Я столкнулся с нечетным случаем при попытке проверить возвращаемое значение, и мне интересно, как это сделать "правильно" в смысле 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
}
Итак, вот вопрос: как точно следует проверять возвращаемое значение, если оно необязательно?