为啥在 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
得到一个值,我确定这个值是String
s 的数组。数组中有数万个字符串。我执行以下操作:
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?的主要内容,如果未能解决你的问题,请参考以下文章