【发布时间】:2016-09-15 21:19:00
【问题描述】:
将我的代码转换为 Swift 3 我发现了一个奇怪的问题。 现在(2016 年 9 月 15 日)Xcode 8(公开版)已经发布,在转换代码后,我的应用程序在没有明显原因的情况下崩溃。
自动布局有问题,日志显示如下:
[_SwiftValue nsli_superitem]: unrecognized selector sent to instance
我该如何解决?谢谢
【问题讨论】:
将我的代码转换为 Swift 3 我发现了一个奇怪的问题。 现在(2016 年 9 月 15 日)Xcode 8(公开版)已经发布,在转换代码后,我的应用程序在没有明显原因的情况下崩溃。
自动布局有问题,日志显示如下:
[_SwiftValue nsli_superitem]: unrecognized selector sent to instance
我该如何解决?谢谢
【问题讨论】:
刚刚找到了奇怪但有效的解决方案:
不要这样做:
let views = ["view":aView]
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "...", options:[], metrics: metrics, views: views))
明确声明字典:
let views: [String:UIView] = ["view":aView]
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "...", options:[], metrics: metrics, views: views))
我知道,这很奇怪,但它确实有效。 干杯
【讨论】:
let views = ["view":aView!]
@IBOutlet weak var aTableView: UITableView!,我认为这意味着它已经被打开了。我猜在 Swift 3 中,这还不够?
在 swift 3 中,我们使用隐式解包选项的方式发生了变化。考虑以下示例:
let optionalInt: Int! = 1
let int = optionalInt
let array = [int, 2]
print(array) // prints: [Optional(1), Optional(2)]
因此,我们现在有[Int?],而不是预期的[Int] 类型的数组,这会导致上述运行时错误。
pascalbros 明确声明变量类型的解决方法解决了这个问题,但为了确定那里发生了什么,我建议检查可能的选项意外进入数组或字典并更改其推断类型。
【讨论】: