【发布时间】:2015-08-02 11:16:45
【问题描述】:
这个周末刚开始研究 Swift。我正在为我的班级创建一个 id 以快速比较对象。我想要一个不可变的 id,所以应该使用 let。
使用 var 并将 id 初始化为 "" 将修复 “在初始化存储属性之前在方法调用中使用 self” 但当然它是可变的。我见过的与此类似的所有其他问题都是关于超级类/调用 super.init,我没有。这很令人沮丧,我不知道为什么它不直截了当。
class MagicCard {
let id:String
let name: String
let manaCost: Int
let description: String
let attack: Int
let defence: Int
init (name: String, manaCost: Int, description: String, attack: Int, defence: Int) {
self.name = name
self.manaCost = manaCost
self.description = description
self.attack = attack
self.defence = defence
id = generateRandomID()
}
private func generateRandomID() -> String {
let charSet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
let charSetArray = Array(charSet.characters)
var id:String = ""
for _ in (0..<10) {
id.append(charSetArray[Int(arc4random()) % charSetArray.count])
}
return id
}
}
func == (lhs: MagicCard, rhs: MagicCard) -> Bool {
return lhs.id == rhs.id
}
【问题讨论】:
-
为什么需要将属性传递给函数?这是一个类方法,因此可以访问 id。在初始化程序中,您可以调用
generateRandomID(),它可以访问id -
@Mark:那是行不通的,因为如果
let将其声明为 constant,则无法从方法中修改id。 -
考虑使用现有的
NSUUID正确生成唯一标识符;您可以通过删除整个generateRandomID()来简化代码(这可能并不总是唯一的)。您还有使用arc4random() % n而不是arc4random_uniform(n)的问题——当n不划分生成的随机数范围时,产生的随机性会有所不同,在这种情况下它不会(差异可能这么小的n可以忽略不计,但绝不会少)。
标签: swift swift2 swift-playground