美文网首页
19、【Swift】嵌套类型

19、【Swift】嵌套类型

作者: Sunday_David | 来源:发表于2020-12-30 05:05 被阅读0次
    • 在一个类型中嵌套另一个类型,将嵌套类型的定义写在其外部类型的 {} 内,而且可以根据需要定义多级嵌套
    • 使用场景:工具类/结构体
    • 适用:枚举、类、结构体

    嵌套类型实践

    • 一个结构体 BlackjackCard(二十一点),嵌套定义枚举类型 SuitRank
    • Ace 牌可以表示 1 或者 11,这一特征通过一个嵌套在 Rank 枚举中的结构体 Values
    struct BlackjackCard {
    
        // 嵌套的 Suit 枚举
        enum Suit: Character {
            case spades = "♠", hearts = "♡", diamonds = "♢", clubs = "♣"
        }
    
        // 嵌套的 Rank 枚举
        enum Rank: Int {
            case two = 2, three, four, five, six, seven, eight, nine, ten
            case jack, queen, king, ace
            struct Values {
                let first: Int, second: Int?
            }
            var values: Values {
                switch self {
                case .ace:
                    return Values(first: 1, second: 11)
                case .jack, .queen, .king:
                    return Values(first: 10, second: nil)
                default:
                    return Values(first: self.rawValue, second: nil)
                }
            }
        }
    
        // BlackjackCard 的属性和方法
        let rank: Rank, suit: Suit
        var description: String {
            var output = "suit is \(suit.rawValue),"
            output += " value is \(rank.values.first)"
            if let second = rank.values.second {
                output += " or \(second)"
            }
            return output
        }
    }
    
    let theAceOfSpades = BlackjackCard(rank: .ace, suit: .spades)
    print("theAceOfSpades: \(theAceOfSpades.description)")
    // 打印“theAceOfSpades: suit is ♠, value is 1 or 11”
    
    • 尽管 RankSuit 嵌套在 BlackjackCard 中,但它们的类型仍可从上下文中推断出来
    • 所以在初始化实例时能够单独通过成员名称(.ace.spades)引用枚举实例

    引用嵌套类型

    • 嵌套类型的类型名前加上其外部类型的类型名,作为前缀
    let heartsSymbol = BlackjackCard.Suit.hearts.rawValue
    // 红心符号为“♡”
    

    相关文章

      网友评论

          本文标题:19、【Swift】嵌套类型

          本文链接:https://www.haomeiwen.com/subject/nkscoktx.html