我在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 错误吗?
感谢您的帮助
答案 0 :(得分:4)
写这个......
set(suit) {
self.suit = suit
}
...你引入了一个无限循环,因为你从setter中调用了setter。
如果您的财产未计算,您应该利用willSet
和didSet
通知程序在财产更改之前/之后执行任何其他工作。
顺便说一句,你也应该删除te getter。访问该属性时,它将导致另一个无限循环。