Swift學習筆記 十五 型別轉換和型別巢狀

2021-07-04 17:38:54 字數 4668 閱讀 6631

型別檢查在

swift

中使用is和as

操作符實現。這兩個操作符提供了一種簡單達意的方式去檢查值的型別或者轉換它的型別。

定義乙個類層次作為例子

class mediaitem 

}class movie: mediaitem

}class song: mediaitem

}let library = [

movie(name: "casablanca", director: "michael curtiz"),

song(name: "blue suede shoes", artist: "elvis presley"),

movie(name: "citizen kane", director: "orson welles"),

song(name: "the one and only", artist: "chesney hawkes"),

song(name: "never gonna give you up", artist: "rick astley")

]// the type of "library" is inferred to be [mediaitem]

library

的儲存的是

movie

和song

的例項,

若你迭代它

,則取出的會是其父類

mediaitem型別,

而不是movie

和song

型別。為了讓它們作為它們本來的型別工作,你需要檢查它們的型別或者向下轉換它們的型別到其它型別。

通過操作符

is來檢查乙個例項是否屬於特定的子型別,返回

true

則屬於

var moviecount = 0

var songcount = 0

for item in library else if item is song

}println("media library contains \(moviecount) movies and \(songcount) songs")

// prints "media library contains 2 movies and 3 songs"

向下轉型

通過型別檢查操作符

as可向下轉型

.但是由於向下轉型可能會失敗

故有兩種形式①可選形式

as?

②強制形式

as!

當你確定轉型一定會成功的時候使用

as!

for item in library  else if let song = item as? song 

}

any和

anyobject

型別檢查

swift

為不確定型別提供了兩種特殊型別別名: ①

anyobject

可以代表任何

class

型別的例項。 ②

any可以表示任何型別,除了方法型別(

function types)。

注意:只有當你明確的需要它的行為和功能時才使用

any和

anyobject

。在你的**裡使用你期望的明確的型別總是更好的。

anyobject型別

let someobjects: [anyobject] = [

movie(name: "2001: a space odyssey", director: "stanley kubrick"),

movie(name: "moon", director: "duncan jones"),

movie(name: "alien", director: "ridley scott")

]

由於這個陣列中只包含

movie例項,

所以你可以直接使用

as!來進行強制解包

for object in someobjects

或者直接將

[anyobject]

強轉成[movie]

for movie in someobjects as! [movie]

any型別

var things = [any]()

things

中包含2

個int,2

個double,1

個string,1

個元組(double, double),

乙個movie物件

for thing in things 

}// zero as an int

// zero as a double

// an integer value of 42

// a positive double value of 3.14159

// a string value of "hello"

// an (x, y) point at 3.0, 5.0

// a movie called 'ghostbusters', dir. ivan reitman

型別巢狀

乙個型別中巢狀另乙個型別,將需要巢狀的型別的定義寫在被巢狀型別的區域

{}內,而且可以根據需要定義多級巢狀

struct blackjackcard 

// 巢狀定義列舉型rank

enum rank: int

var values: values }}

// blackjackcard 的屬性和方法

let rank: rank, suit: 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

來檢查是否存在第二個值,若存在,則在原有的描述中增加對第二數值的描述。 因為

blackjackcard

是乙個沒有自定義建構函式的結構體,在

memberwise initializers for structure types

中知道結構體有預設的成員建構函式,所以你可以用預設的

initializer

去初始化新的常量

theaceofspades:

let theaceofspades = blackjackcard(rank: .ace, suit: .spades)

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

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

儘管rank

和suit

巢狀在blackjackcard

中,但仍可被引用,所以在初始化例項時能夠通過列舉型別中的成員名稱單獨引用。在上面的例子中

description

屬效能正確得輸出對

ace牌有1和

11兩個值。

型別巢狀的引用

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

let heartssymbol = blackjackcard.suit.hearts.toraw()

// 紅心的符號 為 "♡"

swift文件筆記 十五 型別轉換

1.檢查型別 用型別檢查操作符 is 來檢查乙個例項是否屬於特定子型別。若例項屬於那個子型別,型別檢查操作符返回 true 否則返回 false。if item is movie 2.型別轉換操作符 as,as?或as 當要將型別轉換成超類時,和橋接oc物件時,用 as 當你不確定可以成功時,用型別...

Swift 學習筆記 型別轉換

1 子類的物件賦值為基類 原型類 class entity func showtag 人物類 class hero entity 怪物類 class monster entity var hero entity hero entityname 火女 hero.showtag var monster ...

swift學習筆記之string 型別轉換

在swift2.0中string型別的轉換發生了一些改變 其中取消了toint方法 要想講string型別轉換為int型別 要用如下的方法 var str string 12345 vars stras nsstring intvalue print s string型別轉換為double vars...