所以,在玩
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
解决方法
似乎有一些奇怪的东西,可能是马车,继续.如果我拿这个代码:
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"
……对我来说这感觉像是一个小虫.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。