!? for_in []中奇怪的双重解包可选语法?

时间:2015-01-31 02:43:25

标签: swift syntax optional

早些时候,我发现了question,但答案导致了另一个问题。是什么 !?语法,我还没有在其他任何地方看到它,但这是我能够编译代码的唯一方法。有人能告诉我什么“!?”语法意味着什么?这是一个错误吗?该链接显示所有代码。

field.superview!?.superview?.layer.borderWidth = 2

1 个答案:

答案 0 :(得分:4)

UIAlertController的textFields属性是[AnyObject]?。所以这就是你在做的事情:

let textFields : [AnyObject]? = [UIView()] // textFields is an Optional
for field in textFields! { // you unwrap the Optional, but now...
    // ... field is an AnyObject
    let v1 = field.superview // now v1 is a UIView?!
}

你看到了问题吗? AnyObject没有superview属性 - 或任何其他属性。 Swift将允许这样做,但只是以将结果包装在Optional中为代价,因为这可能不是UIView,因此它可能不响应superview(正如我解释here)。所以现在它为你调用superview。但是superview本身会产生一个Optional(因为,如果这是一个UIView,它可能没有superview)。因此双重可选。

但是如果你开始施展,那就不会发生:

for field in textFields as [UIView] {

现在field是一个UIView,发送superview消息是合法的,您只需要处理每个superview的单个解包。