【问题标题】:Changing non-optional variable to Swift optional type breaks all its occurrences in code将非可选变量更改为 Swift 可选类型会破坏其在代码中的所有出现
【发布时间】:2014-11-03 17:37:47
【问题描述】:

我有一个在 Swift 中没有声明为可选类型的实例变量(它总是有一个初始值)。

var array: Array<MyObject> = []

后来在我的项目中,我意识到我应该将其设为可选:

var array: Array<MyObject>?

但是,当我这样做时,它会破坏当前代码中所有出现的变量。我突然不得不在每次调用它时附加一个?

有没有一种方法可以在 Swift 中编写变量,这样当你在可选和非可选之间切换时它的出现不会中断?

【问题讨论】:

  • P.S.使用[MyObject] 而不是Array&lt;MyObject&gt;

标签: ios iphone ipad cocoa-touch swift


【解决方案1】:

如果您不想使其成为真正的可选项,但它必须是nil,您可以将其设置为隐式展开的可选项。你这样声明:

var foo: String!

那么你可以像现在一样使用它,但它也可以是nil。如果你真的确定你确实设置了它,你应该只在没有零检查的情况下使用它。

但是这不是一个好方法,因为你失去了 Swift 为可选项提供的安全性。我仍然只能建议重构为可选,但如果这不可能,这应该可以解决问题。

关于隐式解包选项的更多信息,我想参考“The Swift”中的“基础”“自动引用计数”章节编程语言” Apple 的 iBook。

【讨论】:

  • 我想强调“这不是好方法”。 IUO 非常有用 in certain scenarios,但将它们洒在可选变量上是崩溃的捷径。
  • 我认为应该尽可能避免 IUO,除非是某些情况。不要相信这是其中一种情况。
【解决方案2】:

不是真的,不。
(您也许可以摆脱 Xcode 的一些重构功能,例如 Rename All in Scope。)

但这实际上是一件好事!如果你意识到一个变量需要是可选的,那么你的代码的其余部分也必须实现它,并处理它适当地。在 Swift 中,这是强制执行的。

享受编写更安全的代码!

【讨论】:

  • 为什么你的变量突然变成了可选的?为什么它对您的其余代码无关紧要?这些是您应该考虑的问题类型(通过更多练习,您会更早看到它们,并提前构建它们)。
  • 我将一个数组存储在一个变量中。如果它为零,那么我的视图控制器还没有检索到数据,所以我必须。不能只检查大小是否为 0,因为它是有效的数据计数。
  • 这显然是推荐的答案。重构或保持这种方式。但是在极少数情况下,隐式展开的可选选项是可以的,但我不认为这是一个。
猜你喜欢
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多