在swift中覆盖一个setter [英] Override a setter in swift
问题描述
我在swift中遇到了一个奇怪的问题。我有类PlayCard的代码:
I've got a strange problem with setter in swift. I've got class PlayingCard with code:
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()方法,实现如下:
I use this init() method in another class, and implementation looks like this:
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)
}
}
}
当代码如上所示我遇到错误:
And when the code looks like above I've got a error in line:
self.suit = suit
EXC_BAD_ACCESS(code=2, adress=0x7fff5c4fbff8)
但当我从 rank 和 suit 属性中删除了setter和getter时,它运行正常,没有出现任何错误。
But when I removed setter and getter from rank and suit attribute it's worked fine, no error has shown up.
你能解释一下为什么会出现 EXC_BAD_ACCESS 错误吗?
Can you explain me why this EXC_BAD_ACCESS error has shown up?
谢谢为了你的帮助
推荐答案
通过写这个......
By writing this...
set(suit) {
self.suit = suit
}
...你引入了一个无限循环,因为你在setter中调用了setter。
... you introduce an infinite loop, because you call the setter from within the setter.
如果你的属性没有计算,你应该利用 willSet
和 didSet
通知程序在属性更改之前/之后执行任何其他工作。
If your property isn't computed, you should take advantage of willSet
and didSet
notifiers to perform any additional work before/after the property changes.
顺便说一下,您也应该删除te getter。访问该属性时会导致另一个无限循环。
By the way, you should remove te getter as well. It will cause another infinite loop when accessing the property.
这篇关于在swift中覆盖一个setter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!