微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

properties – 在Swift中调用子类的getter

所以,在玩 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"

……对我来说这感觉像是一个小虫.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐