对重写属性给出的错误使用不明确

时间:2014-06-06 14:37:46

标签: compiler-errors swift

我在一个操场上定义了一个子类和一个超类,代表了Swift中的Card和PlayingCard。

在Card中有一个名为desc的带有getter的计算属性。我已经在子类中重写了这个,以便从仅在子类中定义的两个其他属性计算它。

这一切在操场上运行良好,并按预期打印出“Ace Spades”。

import Cocoa

class Card {
    var desc: String {
    get { return "Default description." }
    }
}

class PlayingCard: Card {
    var suit: String
    var rank: String
    override var desc: String {
    get { return rank + " " + suit }
    }
    init(suit: String, rank: String) {
        self.suit = suit
        self.rank = rank
        super.init()
    }
}

let baseCard = PlayingCard(suit: "Spades", rank: "Ace")
var desc: String
desc = baseCard.desc
println (desc)

然后我尝试实例化相同的Play卡并访问desc变量,但在ViewController中如下:

import UIKit

class ViewController: UIViewController {

    @IBAction func touchCardButton(sender : UIButton)
    {
        let baseCard = PlayingCard(suit: "Spades", rank: "Ace")
        var desc: String
        desc = baseCard.desc
    }

}

但是,这会导致以下错误:     模糊地使用'desc'

更新:当我在问题导航器中展开错误时,它指向它找到不明确的两个候选者:

  • 课程卡片 - var desc: String {
  • 在PlayCard课程中 - override var desc: String {

帮助文档中似乎没有任何内容表明我做错了什么,我找不到任何在线错误的引用。

有什么想法吗?

编辑:我已删除了setter,并且在下面有关滥用计算属性的注释/答案之后,将getter纯粹作为计算属性。但是,现在正确使用此作为计算属性,我仍然收到Ambiguous use of 'desc'错误。

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

这应该是一个评论,但因为我还不能这样做......

var desc: String {
    get { return self.desc }
    set { self.desc = newValue }
    }

错了。如果您使用的是计算属性,则没有self.desc。正如Apple的语言指南所说,

  

除了存储的属性,类,结构和枚举还可以定义计算属性,这些属性实际上不存储值。相反,它们提供了一个getter和一个可选的setter来间接检索和设置其他属性和值。

因此,您的计算属性不能依赖于将自身用作存储属性。事实上,它首先不应该是计算属性。