早些时候,我发现了question,但答案导致了另一个问题。是什么 !?语法,我还没有在其他任何地方看到它,但这是我能够编译代码的唯一方法。有人能告诉我什么“!?”语法意味着什么?这是一个错误吗?该链接显示所有代码。
field.superview!?.superview?.layer.borderWidth = 2
答案 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
的单个解包。