【问题标题】:Why would identical code throw an error in one location but not another?为什么相同的代码会在一个位置而不是另一个位置引发错误?
【发布时间】:2017-01-04 23:52:45
【问题描述】:

我目前正在启动一个项目,我的第一个任务是分解其他人从 AppDelegate 创建的上帝对象。我首先复制了与管理位置相关的代码,目的是将对该代码的调用委托给新对象。

然而,我有两句话让我抓狂。

新文件:

if locationManager?.location?.horizontalAccuracy > horizontalAccuracyCheck{...}

旧文件:

if locationManager?.location?.horizontalAccuracy > horizontalAccuracyCheck{...}

您会注意到代码是相同的。在这两种情况下 self.locationManager?定义为:

var locationManager: CLLocationManager?

但是在新文件中,我收到一条关于“未包装的可选类型的值”的警告——为什么?完全重复的代码,复制和粘贴,有什么不同?

更改代码以解包可以解决问题:

if (locationManager?.location?.horizontalAccuracy)! > horizontalAccuracyCheck{...}

我可以理解为什么我需要显式地打开一个潜在的可选返回。但是……为什么只在一个地方?

【问题讨论】:

  • 我的猜测是迁移器inserted a > overload 用于旧文件中的可选比较,但新文件中没有(我不相信你可以将 Swift 2 和 Swift 3 混合在同一个目标中)。
  • @Hamish 你应该给出这个答案。如果它是正确的,这是一个绝妙的猜测,显然应该成为公认的答案。
  • 哦。 @Hamish 几乎可以肯定是正确的——旧文件中存在重载。它在我的待办事项清单上,以便在某个时候将其删除。

标签: swift swift3


【解决方案1】:

原因是我们在这里讨论的是两种完全不同的语言。一个文件是 Swift 2,另一个文件是 Swift 3。

在 Swift 2 中,您可以使用大于或小于运算符将表示数字的 Optional 与另一个数字进行比较。在 Swift 3 中,你不能这样做。

这是一个更简单的例子:

    let optint : Int? = 7
    let ok = optint < 42

该代码在 Swift 2 中是合法的,但在 Swift 3 中是非法的。

【讨论】:

  • 你是说同一个项目可以同时在Swift2和Swift3中?有趣。
  • 我的猜测是您在将这个项目迁移到 Xcode 8 之后继承了它,从而迁移到了 Swift 3。迁移可以针对一个目标执行,但不能针对另一个目标执行。多种方案也可能使情况复杂化。另外我的记忆是,当迁移 first 发生时,您甚至可以基于每个文件进行迁移(有关信息保存在项目文件中,您看不到它)。我需要查看该项目才能更好地猜测这种情况是如何产生的。但我的猜测是这些文件从未迁移到 Swift 3,但你的新文件默认在 Swift 3 中。
  • 从字面上看,我是迁移它的人。这就是我最初加入的原因 - 新文件是在迁移后创建的。
  • 那么,听起来旧文件没有被迁移。但是,也可能是您看到了编译器故障:尝试退出 Xcode 并清空 Derived Data 文件,看看事情是否顺利。迁移后我看到了一些奇怪的不一致。
  • 文件肯定被迁移了,我已经在另一个问题上清除了派生数据。发生了一些奇怪的事情,不知道是什么,但如果这是“预期的”行为,则无法追踪。
【解决方案2】:

正如in this Q&A 所讨论的那样——Swift 迁移器将插入一个自定义的fileprivate 运算符重载,以便允许可选比较在 Swift 3 中像在 Swift 2 中一样工作。因为这个重载是 fileprivate,您将无法从项目中未定义它的任何其他源文件中使用它,因此您的比较无法在新源文件中编译。

因此,一种解决方案就是将其复制到您的新文件中。另一个是删除fileprivate 访问修饰符。重载将默认为internal,因此模块中的其他 Swift 文件可以访问。

虽然我真的只建议完全删除重载,而是编写自己的显式逻辑以在出现可选比较时进行可选比较 - 重载很容易被滥用(如 Swift evolution proposal 所证明的那样删除它)。

【讨论】:

  • 删除修饰符在我的待办事项列表中,我只是没有将“是的,这表示它应该被删除,所以让我们尽快完成它”和我当前的问题之间的点数联系起来.
  • 太棒了。我不知道迁移者会这样做。现在我需要搜索我自己的代码,以确保它没有对我做同样的事情!
猜你喜欢
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 2013-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多