在swift中覆盖一个setter

时间:2014-08-17 09:43:28

标签: swift ios8

我在swift中遇到了一个奇怪的问题。我上课了,带有代码的PlayCard:

var rank: NSInteger {
    get{
        return self.rank
    }
    set(rank){
        self.rank = rank
    }
}

var suit: NSString {
    get{
        return self.suit
    }
    set(suit){
        self.suit = suit
    }
}

init(suit: NSString, rank: NSInteger) {
    super.init()
    self.suit = suit
    self.rank = rank
}

我在另一个类中使用这个init()方法,实现如下:

init() {
    super.init(cards: [])
    for suit in PlayingCrad.validSuit() {
        var rank: Int = 0
        for rank; rank <= PlayingCrad.maxRank(); rank++ {
            var card = PlayingCrad(suit: suit, rank: rank)
            addCard(card)
        }
    }
}

当代码如上所示时,我遇到了错误:

self.suit = suit

EXC_BAD_ACCESS(code=2, adress=0x7fff5c4fbff8)

但是当我从 rank suit 属性中移除了setter和getter时,它运行正常,没有出现任何错误。

你能解释一下为什么会出现 EXC_BAD_ACCESS 错误吗?

感谢您的帮助

1 个答案:

答案 0 :(得分:4)

写这个......

set(suit) {
    self.suit = suit
}

...你引入了一个无限循环,因为你从setter中调用了setter。

如果您的财产未计算,您应该利用willSetdidSet通知程序在财产更改之前/之后执行任何其他工作。

顺便说一句,你也应该删除te getter。访问该属性时,它将导致另一个无限循环。