为什么用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