Swift 2.0:在初始化存储属性之前在方法调用中使用self

Spa*_*son 12 swift swift-playground swift2

刚开始看这个周末的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
}
Run Code Online (Sandbox Code Playgroud)

s1d*_*dok 9

我可以建议的一个热门修复是创建generateRandomID一个类函数.所以就这样:

private class func generateRandomID() -> String {
Run Code Online (Sandbox Code Playgroud)

并且这样打电话:

id = MagicCard.generateRandomID()
Run Code Online (Sandbox Code Playgroud)


Mar*_*n R 8

generateRandomID()方法不使用或修改实例的任何属性,因此一种可能的解决方案是使其成为 类型(类)方法:

private class func generateRandomID() -> String {
    // ...
    return id
}
Run Code Online (Sandbox Code Playgroud)

并使用它

id = MagicCard.generateRandomID()
Run Code Online (Sandbox Code Playgroud)

(在我写这篇文章时也写在另一个答案中).

您也可以删除该方法并使用"立即评估的闭包":

id = { () -> String in
    // ...
    return id
}()
Run Code Online (Sandbox Code Playgroud)

但是如果id属性的意图是制作对象, Equatable那么你根本就不需要它.类是引用类型,实例可以与"相同"运算符进行比较:

func == (lhs: MagicCard, rhs: MagicCard) -> Bool {
    return lhs === rhs
}
Run Code Online (Sandbox Code Playgroud)

这使得idgenerateRandomID()方法过时了.