在Swift 2.2中,我经常使用类似于的简洁语法声明变量let x = UIView?()。这给出x了UIView?类型,并使用对其进行了初始化nil。 (当然,UIView在这些示例中,您可以使用任何类型)
let x = UIView?()
x
UIView?
nil
UIView
但是,当我在Swift 3.0中执行相同操作时,出现错误: Cannot invoke initializer for type 'UIView?' with no arguments。它还说Overloads for 'UIView?' exist with these partially matching parameter lists: (Wrapped), (nilLiteral: ())。不知何故,我认为UIView?(nilLiteral: ())我所追求的不完全是。
Cannot invoke initializer for type 'UIView?' with no arguments
Overloads for 'UIView?' exist with these partially matching parameter lists: (Wrapped), (nilLiteral: ())
UIView?(nilLiteral: ())
当然,还有其他替代方法可以执行相同的操作,例如let x: UIView? = nil和let x = nil as UIView(),但是它们比我以前使用的方法更为冗长。UIView?()在Swift 3.0中删除了构造函数,还是以我尚未发现的形式替换了它?
let x: UIView? = nil
let x = nil as UIView()
UIView?()
以下将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?()不再起作用的原因”