为什么用Swift包装可选值?是否可以在不声明类型的情况下将变量设置为可选变量?

为什么用Swift包装可选值?是否可以在不声明类型的情况下将变量设置为可选变量?,swift,Swift,如果我想使变量成为可选变量,我可以执行以下操作: var exampleString: String? = nil 或 是否可以声明可选值而不指定字符串、Int、Bool等类型? 类似于(不会返回错误): 我不知道为什么我想这样做,但我正试图更好地理解optionals。我刚刚通读了Swift文档中的选项部分如果可以这样做,这样做会有什么好处吗? 还有,为什么我不想在任何地方使用隐式展开选项?这样做的缺点是什么?苹果的Swift文档提到,如果要将变量重新分配为零,则不应这样做。为什么? 非常感

如果我想使变量成为可选变量,我可以执行以下操作:

var exampleString: String? = nil

是否可以声明可选值而不指定字符串、Int、Bool等类型?

类似于(不会返回错误):

我不知道为什么我想这样做,但我正试图更好地理解optionals。我刚刚通读了Swift文档中的选项部分如果可以这样做,这样做会有什么好处吗?

还有,为什么我不想在任何地方使用隐式展开选项?这样做的缺点是什么?苹果的Swift文档提到,如果要将变量重新分配为零,则不应这样做。为什么?

非常感谢你们的帮助

是否可以声明一个可选值而不指定字符串、Int、Bool等类型

不可以。原因是
Optional
(没有其泛型参数)不是一个完整的类型-将其视为一个类型构造函数,也就是说,如果您提供缺少的信息,则可以生成完整的类型

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

其他泛型类型(如
Array
)也是如此
Array
是类型构造函数,
Array
是完整类型


编辑:提出一个很好的观点:
var示例var:Any?=nil
允许您在此可选字段中存储任何值。请注意,我们仍然在这里处理完整类型-
可选
。只是所有类型都与
Any
兼容。从这个意义上说,
Optional
Optional
没有太大区别,后者可以存储符合
SomeProtocol
协议的任何值

是否可以声明一个可选值而不指定字符串、Int、Bool等类型

不可以。原因是
Optional
(没有其泛型参数)不是一个完整的类型-将其视为一个类型构造函数,也就是说,如果您提供缺少的信息,则可以生成完整的类型

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

其他泛型类型(如
Array
)也是如此
Array
是类型构造函数,
Array
是完整类型


编辑:提出一个很好的观点:
var示例var:Any?=nil
允许您在此可选字段中存储任何值。请注意,我们仍然在这里处理完整类型-
可选
。只是所有类型都与
Any
兼容。从这个意义上说,
Optional
Optional
没有太大区别,后者可以存储符合
SomeProtocol
协议的任何值。

var exampleVar:any?=无
。现在,您有了一个可选选项,可以给它任何值。我一点也不建议这样做,但这样做符合问题的要求。rmaddy为什么不建议使用“Any”作为类型?缺点是什么?@EnricoMatassa仅供参考-将
@
符号放在用户名之前,以便通知此人。根据您所做的,可能会有更好的解决方案。我就到此为止,因为评论不是讨论的地方。@rmaddy:这是一个很好的观点,谢谢。我在回答中添加了一段。
var示例var:Any?=无
。现在,您有了一个可选选项,可以给它任何值。我一点也不建议这样做,但这样做符合问题的要求。rmaddy为什么不建议使用“Any”作为类型?缺点是什么?@EnricoMatassa仅供参考-将
@
符号放在用户名之前,以便通知此人。根据您所做的,可能会有更好的解决方案。我就到此为止,因为评论不是讨论的地方。@rmaddy:这是一个很好的观点,谢谢。我在回答中添加了一段。如果在零的情况下可能会使用未包装的选项,那么隐含的未包装选项是危险的。结果将是一个运行时错误,也称为崩溃。如果代码的逻辑保证它们在使用时都是有效的,那么它们可能是安全的。IBOutlets在使用时是有效的。隐式未包装的选项如果在为零时使用,则是危险的。结果将是一个运行时错误,也称为崩溃。如果代码的逻辑保证它们在使用时都是有效的,那么它们可能是安全的。IBOutlet在使用时有效。
var exampleString: String? = "This is a string"
var exampleVar? = nil