properties – 在Swift中调用子类的getter
发布时间:2020-12-14 05:01:13 所属栏目:百科 来源:网络整理
导读:所以,在玩 Swift的同时,我遇到了这个问题,这令人难以置信. 我有一张卡片: class Card { var contents = "" var chosen = false var matched = false var description: String { get { return self.contents } } func match(otherCards: Card[]) - Int {...}
所以,在玩
Swift的同时,我遇到了这个问题,这令人难以置信.
我有一张卡片: class Card { var contents = "" var chosen = false var matched = false var description: String { get { return self.contents } } func match(otherCards: Card[]) -> Int {...} } 和一个子类卡的类PlayCard: class PlayingCard: Card { var suit: Suit var rank: Rank override var contents: String { get { return "(rank.description())(suit.toRaw())" } set { } } init(rank: Rank,suit: Suit) { self.suit = suit self.rank = rank super.init() } override func match(otherCards: Card[]) -> Int {...} } 如您所见,在Card中,description属性是从contents属性计算的.但是,当我实例化一个PlayingCard时,我有一个计算内容属性,它会覆盖Card的存储内容属性.但是,如果我调用我的PlayCard的描述,它将返回卡的存储内容,而不是PlayCard的计算实际内容. func testPlayingCardProperties() { var card = PlayingCard(rank: .Ace,suit: .Spades) XCTAssert(card.contents == "A??","Contents not overriden.") // TRUE XCTAssert(card.description == "A??","Description not overriden.") // FALSE?? } 这是怎么回事?注意 func testCardProperties() { var card = Card() card.contents = "Test Card" XCTAssert(card.contents == "Test Card","Contents getter error.") // TRUE XCTAssert(card.description == "Test Card","Description getter error.") // TRUE } 按预期工作. UPDATE 我在Playground中运行了以下内容……它运行良好.除此之外仍然没有运气. class Card { var contents = "" var chosen = false var matched = false var description: String { get { return contents } } func match(otherCards: Card[]) -> Int { var score = 0 for card in otherCards { if card.contents == contents { score += 1 } } return score } } enum Suit: String { case Diamonds = "??" case Hearts = "??" case Spades = "??" case Clubs = "??" static func allSuits() -> Suit[] { return [.Diamonds,.Hearts,.Spades,.Clubs] } } enum Rank: Int { case Ace = 1 case Two,Three,Four,Five,Six,Seven,Eight,Nine,Ten case Jack,Queen,King func description() -> String { switch self { case .Ace: return "A" case .Jack: return "J" case .Queen: return "Q" case .King: return "K" default: return String(toRaw()) } } } class PlayingCard: Card { var suit: Suit var rank: Rank override var contents: String { get { return "(rank.description())(suit.toRaw())" } set { } } let maxRank = 13 init(rank: Rank,suit: Suit) { self.suit = suit self.rank = rank } override func match(otherCards: Card[]) -> Int { let allCards = otherCards + [self] let testMatches = { () -> (Card,Card[])[] in var result: (Card,Card[])[] = [] for i in 0..allCards.count { result += (allCards[i],Array(allCards[0..i] + allCards[(i + 1)..allCards.count])) } return result }() let scores = testMatches.map({ (card,otherCards) -> Int in if let playingCard = card as? PlayingCard { var rankValue = 1.0 var suitValue = 1.0 for matchCard in otherCards { if let matchPlayingCard = matchCard as? PlayingCard { if (matchPlayingCard.rank == playingCard.rank) { rankValue *= 8; } else { rankValue /= 2; } if (matchPlayingCard.suit == playingCard.suit) { suitValue *= 2; } else { suitValue /= 2; } } } if rankValue >= 1.0 { return Int(rankValue) } else if suitValue >= 1.0 { return Int(suitValue) } else { return 0 } } else { return 0 } }) return scores.reduce(Int.min,combine: { $0 > $1 ? $0 : $1 }); } } var card = PlayingCard(rank: .Jack,suit: .Spades) card.description 这可能只是一个Xcode错误吗? 解决方法
似乎有一些奇怪的东西,可能是马车,继续.如果我拿这个代码:
class Base { var contents = "Base contents" var description: String { get { return self.contents } } } class Derived : Base { override var contents: String { get { return "Derived contents,dynamically generated" } set { } } } let d = Derived() println(d.contents) println(d.description) …并将其放在一个文件中(在操场上或在命令行OS X应用程序中),然后输出如下(我认为,正如预期的那样): println(d.contents) // Prints "Derived contents,dynamically generated" println(d.description) // Prints "Derived contents,dynamically generated" 但是,如果我将Base类移出“base.swift”并将Derived类移出“derived.swift”,将主代码保留在自己的文件中,不进行其他更改,则打印出: println(d.contents) // Prints "Derived contents,dynamically generated" println(d.description) // Prints "Base contents" ……对我来说这感觉像是一个小虫. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |