我在一个操场上定义了一个子类和一个超类,代表了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 {
override var desc: String {
帮助文档中似乎没有任何内容表明我做错了什么,我找不到任何在线错误的引用。
有什么想法吗?
编辑:我已删除了setter,并且在下面有关滥用计算属性的注释/答案之后,将getter纯粹作为计算属性。但是,现在正确使用此作为计算属性,我仍然收到Ambiguous use of 'desc'
错误。
答案 0 :(得分:2)
这可能与以下已知错误有关:
答案 1 :(得分:1)
这应该是一个评论,但因为我还不能这样做......
var desc: String {
get { return self.desc }
set { self.desc = newValue }
}
错了。如果您使用的是计算属性,则没有self.desc
。正如Apple的语言指南所说,
除了存储的属性,类,结构和枚举还可以定义计算属性,这些属性实际上不存储值。相反,它们提供了一个getter和一个可选的setter来间接检索和设置其他属性和值。
因此,您的计算属性不能依赖于将自身用作存储属性。事实上,它首先不应该是计算属性。