【问题标题】:Why Wrapped Optional Values in Swift? Is it possible to set a variable as optional without declaring a type?为什么在 Swift 中包装可选值?是否可以在不声明类型的情况下将变量设置为可选?
【发布时间】:2018-06-09 21:56:43
【问题描述】:

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

var exampleString: String? = nil

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

是否可以声明一个可选值而不分配 String、Int、Bool 等类型?

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

var exampleVar? = nil

我没有用例说明我为什么要这样做,但我正在努力更好地理解可选项。我刚刚通读了 Swift 文档中的 Optionals 部分。 如果可以做到这一点,这样做有什么好处吗?

另外,为什么我不想在任何地方都使用隐式展开的选项?这样做有什么缺点? Apple 的 Swift 文档提到,如果您打算将变量重新分配为 nil,则不应这样做。为什么?

非常感谢你们的帮助!

【问题讨论】:

  • 隐式展开的可选项如果在它们为 nil 时可能被使用,那么它们是危险的。结果将是运行时错误,也就是崩溃。如果您的代码逻辑保证它们在使用时都是有效的,那么它们可能是安全的。 IBOutlets 使用时有效。

标签: swift


【解决方案1】:

是否可以声明一个可选值而不分配 String、Int、Bool 等类型?

没有。原因是Optional(没有它的泛型参数)不是一个完整的类型——把它想象成一个类型构造函数,也就是说,如果你给它缺失的信息,它可以产生一个完整的类型。

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

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

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

【讨论】:

  • var exampleVar: Any? = nil。您现在有一个可以赋予任何值的选项。我根本不推荐这个,但那种符合问题的要求。
  • rmaddy 为什么不建议使用“Any”作为类型?有什么缺点?
  • @EnricoMatassa 仅供参考 - 将@ 符号放在用户名之前,以便此人得到通知。根据您在做什么,可能会有更好的解决方案。因为 cmets 不是这样讨论的地方,所以我会留下它。
  • @rmaddy:这很好,谢谢。我在答案中添加了一段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
  • 2016-09-18
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多