为什么在Swift中包含可选值?是否可以将变量设置为可选而不声明类型?

时间:2018-06-09 21:56:44

标签: swift

如果我想让变量成为可选项,我可以这样做:

var exampleString: String? = nil

var exampleString: String? = "This is a string"

是否可以在不指定String,Int,Bool等类型的情况下声明可选值?

类似的东西(没有返回错误):

var exampleVar? = nil

我没有用于我为什么要这样做的用例,但我试图更好地理解选项。我刚刚阅读了Swift文档中的Optionals部分。 如果可以这样做,这样做有什么好处吗?

另外,为什么我不想在任何地方使用隐式解包的选项?这有什么不利之处? Apple的Swift文档提到如果你打算将变量重新分配为nil,你就不应该这样做。为什么呢?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:4)

  

是否可以在不指定String,Int,Bool等类型的情况下声明可选值?

没有。原因是Optional(没有它的泛型参数)不是一个完整的类型 - 把它想象成一个类型的构造函数,即如果你给它缺少一个生成完整类型的方法信息。

编译器需要知道完整类型 - Optional<Int>Optional<String>等等 - 以分配适当数量的内存等。Optional<String>将占用比{Optional<Bool>更多的内存{1}},即使两者都是nil

对于Array等其他通用类型也是如此。 Array是类型构造函数,Array<Int>是完整类型。

编辑:rmaddy提出了一个很好的观点:var exampleVar: Any? = nil允许您在此可选项中存储任何值。请注意,我们仍在处理完整类型 - Optional<Any>。只是所有类型都与Any兼容。从这个意义上讲,Optional<Any>Optional<SomeProtocol>没有什么不同,后者可以存储符合SomeProtocol协议的任何值。