Swift 3.0 中的 UIView?() 构造函数发生了什么变化?

3
在Swift 2.2中,我经常使用类似于let x = UIView?()的简洁语法声明变量。这为x赋予了UIView?类型,并用nil进行初始化。(当然,在这些示例中,您可以使用任何类型而不是UIView) 然而,在Swift 3.0中,当我尝试相同的操作时,出现错误:Cannot invoke initializer for type 'UIView?' with no arguments。它还说存在UIView?的重载,其中包含这些部分匹配的参数列表:(Wrapped),(nilLiteral: ())。但是,我认为UIView?(nilLiteral: ())并不是我想要的。
当然,还有其他替代方法来完成相同的事情,例如let x: UIView? = nillet x = nil as UIView(),但它们比我之前使用的方法更冗长。在Swift 3.0中,UIView?()构造函数被删除了吗?或者它以我尚未发现的形式被替换了吗?

4
请使用正确的方式,即 var x: UIView? = nil 或仅使用 var x: UIView?。不要试图想出替代语法。 - Sulthan
1
let x = UIView?() 的问题在于它看起来与 let x = UIView() 非常相似,但却完全不同。你可以为 Optional 添加一个 init() 扩展来添加初始化方法,但我强烈建议不要这样做。 - Hamish
2
试着接受你之前“经常做”的方式是错误的,你不能再那样做了,然后继续前进。 - matt
@Hamish:好的,谢谢。如果那个构造函数因为那个原因在Swift 3中被删除了,那对我来说没问题,这也是我要找的答案。 - Ben
2
@Sarcoma 语法 UIView? 只是 Optional<UIView> 的语法糖,因此 UIView?() 只是 Optional<UIView>.init() 的语法糖。在 Swift 2 中,Optionalinit() 构造一个新的可选值,并将其设置为 .None。所以说,它确实是正确的。然而,在 Swift 3 中,这个初始值设定器已经被移除了,这就是为什么 UIView?() 不再起作用的原因。 - Hamish
显示剩余6条评论
1个回答

3
以下代码初始化x为nil,括号完全是多余的。
var x: UIView?
return x == nil

会返回 true

查看开发者文档获取更多信息。

https://developer.apple.com/library/content//documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html

如果您定义一个可选变量但没有提供默认值,则该变量会自动设置为 nil:

var surveyAnswer: String?
// surveyAnswer is automatically set to nil

@Hamish发表评论以澄清UIView?()不再起作用的原因:

“UIView?语法只是Optional的语法糖,因此UIView?()只是Optional.init()的语法糖。在Swift 2中,Optional的init()构造一个新的可选值设置为.None。所以,是的,它曾经是可以工作的。然而,在Swift 3中,这个初始化器已被删除,这就是为什么UIView?()不再工作的原因。”


谢谢你指引我正确的方向——很容易跳过介绍章节!顺便提一下,根据文档,你的第一个例子应该写成 let x: UIView? ;) 除此之外,那个语法是一个很好的替代品,谢谢! - Ben
哈,是的,一定要变量!我通常只需双击感叹号即可修复它 :) - OrderAndChaos
啊,不对。无论是 var 还是 let,都应该使用 : 而不是 =,并且让它使用默认值 nil(就像你从文档中复制的示例一样)。 - Ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接