Swift中文教程(十九)型別巢狀

2021-07-02 19:50:27 字數 1599 閱讀 2097

列舉型別常被用於實現特定類或結構體的功能。也能夠在有多種變數型別的環境中,方便地定義通用類或結構體來使用,為了實現這種功能,swift允許你定義型別巢狀,可以在列舉型別、類和結構體中定義支援巢狀的型別。

要在乙個型別中巢狀另乙個型別,將需要巢狀的型別的定義寫在被巢狀型別的區域{}內,而且可以根據需要定義多級巢狀。

),用來模擬blackjackcard中的撲克牌點數。blackjackcard結構體包含2個巢狀定義的列舉型別suit 和 rank。

在blackjackcard規則中,ace牌可以表示1或者11,ace牌的這一特徵用乙個巢狀在列舉型rank的結構體values來表示。

struct blackjackcard 

// 巢狀定義列舉型rank

enum rank: int

var values: values }}

// blackjackcard 的屬性和方法

: suit

var description: string

return output

}}

列舉型的suit用來描述撲克牌的四種花色,並分別用乙個character型別的值代表花色符號。

列舉型的rank用來描述撲克牌從ace~10,j,q,k,13張牌,並分別用乙個int型別的值表示牌的面值。(這個int型別的值不適用於ace,j,q,k的牌)。

如上文所提到的,列舉型rank在自己內部定義了乙個巢狀結構體values。這個結構體包含兩個變數,只有ace有兩個數值,其餘牌都只有乙個數值。結構體values中定義的兩個屬性:

first, 為int second, 為 int?, 或 「optional int」

rank定義了乙個計算屬性values,這個計算屬性會根據牌的面值,用適當的數值去初始化values例項,並賦值給values。對於j,q,k,ace會使用特殊數值,對於數字面值的牌使用int型別的值。

blackjackcard結構體自身有兩個屬性—rank與suit,也同樣定義了乙個計算屬性description,description屬性用rank和suit的中內容來構建對這張撲克牌名字和數值的描述,並用可選型別second來檢查是否存在第二個值,若存在,則在原有的描述中增加對第二數值的描述。

,所以你可以用預設的initializer去初始化新的常量theaceofspades:

: .spades)

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

// 列印出 "theaceofspades: suit is ♠, value is 1 or 11"

儘管rank和suit巢狀在blackjackcard中,但仍可被引用,所以在初始化例項時能夠通過列舉型別中的成員名稱單獨引用。在上面的例子中description屬效能正確得輸出對ace牌有1和11兩個值。

在外部對巢狀型別的引用,以被巢狀型別的名字為字首,加上所要引用的屬性名:

heartssymbol = blackjackcard.suit.hearts.toraw()

// 紅心的符號 為 "♡"

對於上面這個例子,這樣可以使suit, rank, 和 values的名字盡可能的短,因為它們的名字會自然的由被定義的上下文來限定。

Swift中文教程1

swift語言概覽 基本概念 注 這一節的 源自the swift programming language中的a swift tour。hello,world 類似於指令碼語言,下面的 即是乙個完整的swift程式。swift使用var宣告變數,let宣告常量。型別推導 swift支援型別推導 t...

Swift中文教程3

呼叫方法 swift中,函式的引數名稱只能在函式內部使用,但方法的引數名稱除了在內部使用外還可以在外部使用 第乙個引數除外 例如 注意swift支援為方法引數取別名 在上面的 裡,numberoftimes面向外部,times面向內部。的另一種用途 使用可空值時,可以出現在方法 屬性或下標前面。如果...

Swift中文教程 基礎

隱藏 2注釋3分號4整數 5浮點數 6型別安全及型別推斷 7數字字面量 literals 8數字型別轉換 9型別別名 aliases 10布林值 11元組 12可選量 13斷言 assertions 常量和變數把乙個名字 比如maximumnumberofloginattempts或者welcome...