型別檢查在
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...