【问题标题】:Swift optimization level breaks converting NSArray to ArraySwift 优化级别中断将 NSArray 转换为 Array
【发布时间】:2014-12-29 19:32:00
【问题描述】:

Swift 优化级别 设置为 None [-Onone](调试的默认值)时,以下(有些人为的)代码可以工作:

    let nsa = NSArray(array: ["foo", "bar"])
    let a = nsa as [String]

但是当设置为 Fastest [-O](发布的默认值)时,应用程序在运行时崩溃 (crash log)。

我很幸运地发现我可以通过这样做来解决这个问题:

    let a = nsa as [AnyObject] as [String]

我的问题有两个:

  1. 您能帮我理解为什么会这样吗?
  2. 有没有更好的方法将 NSArray 转换为 Array?

更新

这似乎是一个错误。我没有向苹果报告。如果其他人愿意花时间这样做,请这样做!

【问题讨论】:

  • 旁注:将 NSMutableArray 转换为 Array 的类似情况:dev.eltima.com/post/96538497489/…
  • “休息”是什么意思?产生了哪些消息?
  • @HotLicks 应用程序在访问该代码时崩溃。嗯……让我找出来……请稍等……
  • @HotLicks 好的,我添加了崩溃日志的链接。
  • 今天的 Xcode 6.2 版本仍然存在问题。非常感谢您找到的解决方法。在我们的例子中,我发现当我们在声明后面添加NSLog("%@", nsa)(继续你的例子)时,它会很有趣。但是,一旦删除该行,它就崩溃了。 stackoverflow.com/questions/29003323/…

标签: swift nsarray


【解决方案1】:

它似乎已在 Xcode Version 6.3.1 (6D1002) 上修复。

而且,不是您原来的问题的答案,而是随着新 Swift 1.2 的引入,as 是强制转换,现在被更明确的as! 取代。您应该期望 NSArrayArray<T> 会导致 T != AnyObject or NSObject 崩溃。

你最好使用条件转换as?。尽可能避免!

let nsa = NSArray(array: ["foo", "bar"])
if let a = nsa as? [String] {
    println("a \(a)")
}

【讨论】:

    猜你喜欢
    • 2014-08-16
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    相关资源
    最近更新 更多