在swift中覆盖一个setter [英] Override a setter in swift

查看:110
本文介绍了在swift中覆盖一个setter的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆