【发布时间】:2017-06-11 10:00:30
【问题描述】:
所以,我正在将我的 Android 应用程序移植到 iOS 并且我正在使用 Swift (3)。
我了解 Computed 属性的概念,并尝试尽可能多地使用它们,但这让我想到,也许我做得过火了,这将对我的应用程序产生性能影响。
所以我的场景: 我有一个有两个字符串的类,其中一个是我的用户名,它是全球认为我的应用程序,另一个是对手的用户名。所以我的代码是这样的:
class Game {
let player: String
let opponent: String
var iAmPlayer: Bool {
return player.caseInsensitiveCompare(GlobalUsername) == .orderedSame
}
init(player: String, opponent: String) {
self.player = player
self.opponent = opponent
}
}
我经常检查 iAmPlayer 布尔值,以查看用户是否启动了游戏,尤其是在订购游戏对象时。在 java 中,我只有一个在初始化对象时设置的布尔变量。我想知道,如果我在这里只使用存储属性而不是我正在做的事情会更好吗?计算属性是否已优化,或者每次我尝试访问 iAmPlayer var 时都会进行计算?
P.S.:一旦创建了 Game 对象,玩家和对手就不会改变。 (因此让)
【问题讨论】:
-
是的,每次参考
iAmPlayer时都会进行计算。因此,存储的属性会更有效率。 (我假设不仅player和opponent都不能改变,而且GlobalUsername也不能改变?) -
这只能在
player和GlobalUsername没有改变的情况下被优化掉,并且只有当编译器可以推断出caseInsensitiveCompare是引用透明的。这当然是可能的,但您必须亲自查看生成的代码。 -
@Rob 是的,没有一个值可以改变。如果有任何变化,将创建一个新的 Game 对象,因为它们是从我的服务器获取的。我还有一些其他的类,我对 var 做同样的事情,可以改变。计算属性是否更适合那里?
-
@Alexander 所以你的建议是我应该为我的布尔值使用存储属性,因为它无法优化,或者你真的想查看生成的代码? (如果是,怎么做?)
-
@LucasP。在您分析您的应用程序并将其确定为性能问题之前,我会坚持使用您认为最干净和最简单的任何技术。我个人更喜欢存储的财产,但这只是我
标签: ios swift properties