Хотя ответ Леонардо является хорошим, то это может привести к исключениям, если вы не знаете, объекты не являются необязательными, лучше картина этого, которую следует рассматривать как псевдокод:
if let frame = NSScreen.screens()?.first?.frame {
// Do something with frame.
}
других слова, использовать дополнительные цепочки (?.
), но только с помощью let
с самой последней частью цепи.
Вы также можете создать оператор, как это, если вы хотите цепи дополнительных опций, которые имеют другой типа, в котором только значение последнего будет возвращено:
infix operator ??? { associativity left }
func ??? <T1, T2>(t1: T1?, t2: @autoclosure() -> T2?) -> T2? {
return t1 == nil ? nil : t2()
}
if let frame = self.window ??? NSScreen.screens()?.first?.frame {
// Do something with frame
}
Это, конечно, , вдохновленный связью Хаскелла. Но, как весело, я не рекомендую. Я думаю, это ясно, как грязь. (Кстати, разница между ???
и ??
является то, что бывший делает не требуют LHS и RHS быть одного и того же типа (или надтипа), в то время как последний делает. ???
всегда возвращает его RHS или nil
.)
возможно дубликат [Swift Необязательные связывание с кортежами] (http://stackoverflow.com/questions/27991378/swift-optional-binding-with-tuples) –
смотри также HTTP: // StackOverflow .com/questions/24548999/unwrapping-multiple-optionsals-in-if-statement/25048307 # 25048307 –
@AlexBrown Извините, я не думаю, что любой из этих вопросов точно совпадает с этим. Вопроситель говорит о цепочке опциональных. Взгляните на некоторые из приведенных ниже ответов.(Я не сомневаюсь, однако, что этот вопрос является обманом какого-то другого, а не того, с которым вы связались.) –