为啥在 Swift 中的铸造成本如此之高,而不是……将其保留为 AnyObject?

Posted

技术标签:

【中文标题】为啥在 Swift 中的铸造成本如此之高,而不是……将其保留为 AnyObject?【英文标题】:Why is casting so expensive in Swift compared to just... leaving it as AnyObject?为什么在 Swift 中的铸造成本如此之高,而不是……将其保留为 AnyObject? 【发布时间】:2015-07-19 04:43:23 【问题描述】:

我从NSUserDefaults 得到一个值,我确定这个值是Strings 的数组。数组中有数万个字符串。我执行以下操作:

let identifiers = NSUserDefaults.standardUserDefaults().objectForKey("UserIdentifiers") as! [String]

在 iPhone 6 上处理需要 0.5 秒。

最后移除演员表? 0.000107 秒

它是否检查数组中的每一项以确保它是一个字符串?能不能……不要那样?

即使我只是将它转换为 [AnyObject],它仍然需要大约 0.3 秒。

【问题讨论】:

你有没有试过as! NSArray,花了多长时间 @Leo 这加快了速度很多。也许它只是不喜欢 Swift。 :// 我认为因为objectForKey是返回一个Anyobject?,而[String] 是swift类型的Array,所以Swift必须循环每个部分以确保它可以成功转换。 只是对“数组中有数万个字符串”的注释。然后您不应该将其存储在NSUserDefaults 中。它旨在存储少量数据,例如用户设置,而不是存储“数万”项的数据库。 NSUserDefaults 存储在 Plist 中。想象一下在设备的内存中解析和存储它的代价 【参考方案1】:

Lukas Kukacka 是正确的......当你开始使用 NSUserDefaults 存储大量值时,缺陷就开始了。您将 NSUserDefaults 用于需要全局访问的少量数据。 您应该创建一个服务类来执行此操作,而不是内置在 UserDefaults 中。

关于类型转换,String 是基于 swift 的,NSString 比 String 快得多。你可能会失去一些功能,但它会快得多。请查看以下链接以获取前言:

http://en.swifter.tips/string-nsstring/

【讨论】:

以上是关于为啥在 Swift 中的铸造成本如此之高,而不是……将其保留为 AnyObject?的主要内容,如果未能解决你的问题,请参考以下文章

为啥铸造给CS0030,而“as”有效?

任何不一致的铸造?在可选绑定期间进入 Swift 中的协议

为啥 Swift 类需要 init 而不是 Swift struct

为啥在 Swift 中使用“let”而不是 var?

区块链2.0-共识机制如何打破互联网信息大爆炸

为啥表情符号字符像????‍????‍??????‍????在 Swift 字符串中被如此奇怪地对待?