swift嵌套类型_swift Nested Types

分享到:

枚举类型通常被用于实现某特定类或结构的功能。同样地,仅以使用为目的,可以在类型更为复杂的语境中方便地定义通用类和结构体。为了实现这种功能, Swift允许你定义嵌套类型,可以在枚举类型、类和结构体中定义嵌套支持的类型。

要在一个类型中嵌套另一个类型,应在被嵌套类型的外括号内编写需嵌套类型的定义。按照需要,类型可以多层次嵌套。

 

嵌套类型实例

以下示例定义了名为BlackjackCard的结构体,该结构体模拟了二十一点游戏)中使用的扑克牌点数。BlackJack结构体包含两个嵌套式枚举类型Suit和Rank。

在Blackjack游戏中,Ace卡的点数可以为1或11。这一特征由结构体Values表示,该结构体被嵌套在Rank枚举中:

 

struct BlackjackCard {

// nested Suit enumeration

enum Suit: Character {

case Spades = "♠", Hearts = "♡", Diamonds = "♢", Clubs = "♣"

}

// nested Rank enumeration

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.toRaw(), second: nil)

}

}

BlackjackCard properties and methods

rank: Rank, suit: Suit

var description: String {

var output = "suit is \(suit.toRaw()),"

output += " value is \(rank.values.first)"

if let second = rank.values.second {

output += " or \(second)"

}

return output

 

Suit枚举描述四种常用的扑克牌花色,分别用一个原始Character类型的值代表花色符号。

Rank枚举描述十三张可能的扑克牌排列方式,分别用一个原始Int类型的值表示牌的面值。(此原Int类型的值不适用于Jack, Queen, King 和 Ace的牌。)

如上所述,Rank枚举定义了其本身更深层次的嵌套结构体values。这个结构体概述了一项事实:大多数牌均有一个值,但Ace有两个值。该值结构体定义了两个属性,表述为:

Rank还定义了一个计算属性,用于返回Values结构体的实例。这个计算属性会考虑牌的面值,并根据牌的面值,采用适当的值将新增Values实例初始化,。对于Jack、 Queen、 King 和 Ace,它采用了特定值。对于数字面值的牌采用rank属性的原Int值。

该BlackjackCard结构体本身有两个属性—rank 和suit.它还定义了一个计算属性description,该属性采用rank和suit中存储的值来构建对这张牌名称和值的描述。并且使用可选绑定来检查是否有第二个值可以显示,如果有,则针对第二个值插入其他描述细节。

由于BlackjackCard是一个不具有自定义初始化函数的结构体,正如BlackjackCard结构体有默认的成员初始化函数。你可以使用默认的initializer去初始化新的常量the AceOfSpades:

 

let theAceOfSpades = BlackjackCard(rank: .Ace, suit: .Spades)

println("theAceOfSpades: \(theAceOfSpades.description)")

// prints "theAceOfSpades: suit is ♠, value is 1 or 11"

 

即使Rank和Suit被嵌套在BlackjackCard中,其类型也可根据上下文推断;因此,此实例的初始化可以通过枚举成员的成员名称(.Ace 和.Spades)来单独引用。在以上示例中,description属性准确地报告出AceOfSpades 有1或11两个值。

引用嵌套类型

 

要使用其定义上下文外的嵌套类型,用被嵌入类型的名称为前缀:

 

let heartsSymbol = BlackjackCard.Suit.Hearts.toRaw()

// heartsSymbol is "♡"

 

针对以上示例,这样做使Suit,Rank和Values的名称尽可能的简短,因为这些名称会自然的由被定义的上下文来限定。

昵    称:
验证码:

相关文档:

swift
IOS实例
ObjectiveC