在Swift中,我可以声明任何类型的存储属性,如:
class MyClass {
let foo : AnyObject
}
然后,Swift会抱怨MyClass
没有初始化程序。我在这里有几个选择:
// 1. Assign a default value to `foo`, like so:
class MyClass {
let foo : AnyObject = "bar"
}
// 2. Create an initializer,
// which assigns a default value to `foo` before returning.
class MyClass {
let foo : AnyObject
init() {
foo = "bar"
}
}
// 3. Make `foo` into an optional,
// which changes its type, but removes the
// requirement for a default value.
class MyClass {
let foo : AnyObject?
}
但是,如果我将foo
置于闭包中,则选项3不再有效。例如,考虑一下:
class MyClass {
let foo : ((bar : AnyObject)-> Void)
}
此代码示例导致编译器抱怨:
MyClass
没有初始值设定项。 - Swift 2.1编译器
这是合理的,所以让我们尝试不同的解决方案:
class MyClass {
let foo : ((bar : AnyObject)-> Void) = {() -> Void in }
}
这很有效,因为我们已经分配了一个默认值。但这可能不是我想要的。我们可以将默认值更改为nil
,但前提是我们将该属性设置为Optional。我们试试吧:
class MyClass {
let foo : ((bar : AnyObject)-> Void)? = nil
}
这样可行,但如果我们要删除= nil
部分呢?
class MyClass {
let foo : ((bar : AnyObject)-> Void)?
}
编译器抛出与以前相同的错误!为什么?即使没有默认值,也不应该使我的属性可选足够吗?