Swift 語(yǔ)言類(lèi)型轉(zhuǎn)換可以判斷實(shí)例的類(lèi)型趣席。也可以用于檢測(cè)實(shí)例類(lèi)型是否屬于其父類(lèi)或者子類(lèi)的實(shí)例,或是否實(shí)現(xiàn)了某個(gè)協(xié)議。
Swift 中類(lèi)型轉(zhuǎn)換使用 is
和 as
操作符實(shí)現(xiàn)杂曲,is
用于檢測(cè)值的類(lèi)型诈火,as
用于轉(zhuǎn)換類(lèi)型兽赁。
class Subjects {
var physics: String
init(physics: String) {
self.physics = physics
}
}
class Chemistry: Subjects {
var equations: String
init(physics: String, equations: String) {
self.equations = equations
super.init(physics: physics)
}
}
class Maths: Subjects {
var formulae: String
init(physics: String, formulae: String) {
self.formulae = formulae
super.init(physics: physics)
}
}
let sa = [
Chemistry(physics: "固體物理", equations: "赫茲"),
Maths(physics: "流體動(dòng)力學(xué)", formulae: "千兆赫")]
let samplechem = Chemistry(physics: "固體物理", equations: "赫茲")
print("實(shí)例物理學(xué)是: \(samplechem.physics)")
print("實(shí)例方程式: \(samplechem.equations)")
let samplemaths = Maths(physics: "流體動(dòng)力學(xué)", formulae: "千兆赫")
print("實(shí)例物理學(xué)是: \(samplemaths.physics)")
print("實(shí)例公式是: \(samplemaths.formulae)")
// 實(shí)例物理學(xué)是: 固體物理
// 實(shí)例方程式: 赫茲
// 實(shí)例物理學(xué)是: 流體動(dòng)力學(xué)
// 實(shí)例公式是: 千兆赫
1. 檢查類(lèi)型
類(lèi)型檢查使用is
關(guān)鍵字,用于檢測(cè)實(shí)例類(lèi)型是否屬于特定的實(shí)例類(lèi)型冷守。
你可以將它用在類(lèi)和子類(lèi)的層次結(jié)構(gòu)上刀崖,檢查特定類(lèi)實(shí)例的類(lèi)型并且轉(zhuǎn)換這個(gè)類(lèi)實(shí)例的類(lèi)型成為這個(gè)層次結(jié)構(gòu)中的其他類(lèi)型。
class Subjects {
var physics: String
init(physics: String) {
self.physics = physics
}
}
class Chemistry: Subjects {
var equations: String
init(physics: String, equations: String) {
self.equations = equations
super.init(physics: physics)
}
}
class Maths: Subjects {
var formulae: String
init(physics: String, formulae: String) {
self.formulae = formulae
super.init(physics: physics)
}
}
let sa = [
Chemistry(physics: "固體物理", equations: "赫茲"),
Maths(physics: "流體動(dòng)力學(xué)", formulae: "千兆赫"),
Chemistry(physics: "熱物理學(xué)", equations: "分貝"),
Maths(physics: "天體物理學(xué)", formulae: "兆赫"),
Maths(physics: "微分方程", formulae: "余弦級(jí)數(shù)")]
let samplechem = Chemistry(physics: "固體物理", equations: "赫茲")
print("實(shí)例物理學(xué)是: \(samplechem.physics)")
print("實(shí)例方程式: \(samplechem.equations)")
let samplemaths = Maths(physics: "流體動(dòng)力學(xué)", formulae: "千兆赫")
print("實(shí)例物理學(xué)是: \(samplemaths.physics)")
print("實(shí)例公式是: \(samplemaths.formulae)")
var chemCount = 0
var mathsCount = 0
for item in sa {
// 如果是一個(gè) Chemistry 類(lèi)型的實(shí)例拍摇,返回 true亮钦,相反返回 false。
if item is Chemistry {
++chemCount
} else if item is Maths {
++mathsCount
}
}
print("化學(xué)科目包含 \(chemCount) 個(gè)主題授翻,數(shù)學(xué)包含 \(mathsCount) 個(gè)主題")
// 實(shí)例物理學(xué)是: 固體物理
// 實(shí)例方程式: 赫茲
// 實(shí)例物理學(xué)是: 流體動(dòng)力學(xué)
// 實(shí)例公式是: 千兆赫
// 化學(xué)科目包含 2 個(gè)主題或悲,數(shù)學(xué)包含 3 個(gè)主題
2. 向下轉(zhuǎn)型
向下轉(zhuǎn)型,用類(lèi)型轉(zhuǎn)換操作符:as
as?
as!
as |
系統(tǒng)中的大多數(shù)的CF對(duì)象可以使用as 直接轉(zhuǎn)換為Swift類(lèi)型 |
---|---|
as? |
當(dāng)你不確定向下轉(zhuǎn)型可以成功時(shí)堪唐,用類(lèi)型轉(zhuǎn)換的條件形式as? 巡语。條件形式的類(lèi)型轉(zhuǎn)換總是返回一個(gè)可選值,并且若下轉(zhuǎn)是不可能的淮菠,可選值將是 nil 男公。 |
as! |
只有你可以確定向下轉(zhuǎn)型一定會(huì)成功時(shí),才使用強(qiáng)制形式as! 合陵。當(dāng)你試圖向下轉(zhuǎn)型為一個(gè)不正確的類(lèi)型時(shí)枢赔,強(qiáng)制形式的類(lèi)型轉(zhuǎn)換會(huì)觸發(fā)一個(gè)運(yùn)行時(shí)錯(cuò)誤。 |
class Subjects {
var physics: String
init(physics: String) {
self.physics = physics
}
}
class Chemistry: Subjects {
var equations: String
init(physics: String, equations: String) {
self.equations = equations
super.init(physics: physics)
}
}
class Maths: Subjects {
var formulae: String
init(physics: String, formulae: String) {
self.formulae = formulae
super.init(physics: physics)
}
}
let sa = [
Chemistry(physics: "固體物理", equations: "赫茲"),
Maths(physics: "流體動(dòng)力學(xué)", formulae: "千兆赫"),
Chemistry(physics: "熱物理學(xué)", equations: "分貝"),
Maths(physics: "天體物理學(xué)", formulae: "兆赫"),
Maths(physics: "微分方程", formulae: "余弦級(jí)數(shù)")]
let samplechem = Chemistry(physics: "固體物理", equations: "赫茲")
print("實(shí)例物理學(xué)是: \(samplechem.physics)")
print("實(shí)例方程式: \(samplechem.equations)")
let samplemaths = Maths(physics: "流體動(dòng)力學(xué)", formulae: "千兆赫")
print("實(shí)例物理學(xué)是: \(samplemaths.physics)")
print("實(shí)例公式是: \(samplemaths.formulae)")
var chemCount = 0
var mathsCount = 0
for item in sa {
// 類(lèi)型轉(zhuǎn)換的條件形式
if let show = item as? Chemistry {
print("化學(xué)主題是: '\(show.physics)', \(show.equations)")
// 強(qiáng)制形式
} else if let example = item as? Maths {
print("數(shù)學(xué)主題是: '\(example.physics)', \(example.formulae)")
}
}
/*
實(shí)例物理學(xué)是: 固體物理
實(shí)例方程式: 赫茲
實(shí)例物理學(xué)是: 流體動(dòng)力學(xué)
實(shí)例公式是: 千兆赫
化學(xué)主題是: '固體物理', 赫茲
數(shù)學(xué)主題是: '流體動(dòng)力學(xué)', 千兆赫
化學(xué)主題是: '熱物理學(xué)', 分貝
數(shù)學(xué)主題是: '天體物理學(xué)', 兆赫
數(shù)學(xué)主題是: '微分方程', 余弦級(jí)數(shù)
*/
3. Any和AnyObject的類(lèi)型轉(zhuǎn)換
OC中的id
類(lèi)型在Swift中使用AnyObject
拥知,Swift為不確定類(lèi)型提供了兩種特殊類(lèi)型別名:
-
AnyObject
可以代表任何class
類(lèi)型的實(shí)例踏拜。 -
Any
可以表示任何類(lèi)型,包括基本類(lèi)型(Int
Double
)低剔、方法類(lèi)型(function types)速梗、枚舉結(jié)構(gòu)體肮塞、指針等。
Any 實(shí)例
class Subjects {
var physics: String
init(physics: String) {
self.physics = physics
}
}
class Chemistry: Subjects {
var equations: String
init(physics: String, equations: String) {
self.equations = equations
super.init(physics: physics)
}
}
class Maths: Subjects {
var formulae: String
init(physics: String, formulae: String) {
self.formulae = formulae
super.init(physics: physics)
}
}
let sa = [
Chemistry(physics: "固體物理", equations: "赫茲"),
Maths(physics: "流體動(dòng)力學(xué)", formulae: "千兆赫"),
Chemistry(physics: "熱物理學(xué)", equations: "分貝"),
Maths(physics: "天體物理學(xué)", formulae: "兆赫"),
Maths(physics: "微分方程", formulae: "余弦級(jí)數(shù)")]
let samplechem = Chemistry(physics: "固體物理", equations: "赫茲")
print("實(shí)例物理學(xué)是: \(samplechem.physics)")
print("實(shí)例方程式: \(samplechem.equations)")
let samplemaths = Maths(physics: "流體動(dòng)力學(xué)", formulae: "千兆赫")
print("實(shí)例物理學(xué)是: \(samplemaths.physics)")
print("實(shí)例公式是: \(samplemaths.formulae)")
var chemCount = 0
var mathsCount = 0
for item in sa {
// 類(lèi)型轉(zhuǎn)換的條件形式
if let show = item as? Chemistry {
print("化學(xué)主題是: '\(show.physics)', \(show.equations)")
// 強(qiáng)制形式
} else if let example = item as? Maths {
print("數(shù)學(xué)主題是: '\(example.physics)', \(example.formulae)")
}
}
// 可以存儲(chǔ)Any類(lèi)型的數(shù)組 exampleany
var exampleany = [Any]()
exampleany.append(12)
exampleany.append(3.14159)
exampleany.append("Any 實(shí)例")
exampleany.append(Chemistry(physics: "固體物理", equations: "兆赫"))
for item2 in exampleany {
switch item2 {
case let someInt as Int:
print("整型值為 \(someInt)")
case let someDouble as Double where someDouble > 0:
print("Pi 值為 \(someDouble)")
case let someString as String:
print("\(someString)")
case let phy as Chemistry:
print("主題 '\(phy.physics)', \(phy.equations)")
default:
print("None")
}
}
/*
實(shí)例物理學(xué)是: 固體物理
實(shí)例方程式: 赫茲
實(shí)例物理學(xué)是: 流體動(dòng)力學(xué)
實(shí)例公式是: 千兆赫
化學(xué)主題是: '固體物理', 赫茲
數(shù)學(xué)主題是: '流體動(dòng)力學(xué)', 千兆赫
化學(xué)主題是: '熱物理學(xué)', 分貝
數(shù)學(xué)主題是: '天體物理學(xué)', 兆赫
數(shù)學(xué)主題是: '微分方程', 余弦級(jí)數(shù)
整型值為 12
Pi 值為 3.14159
Any 實(shí)例
主題 '固體物理', 兆赫
*/
AnyObject 實(shí)例
class Subjects {
var physics: String
init(physics: String) {
self.physics = physics
}
}
class Chemistry: Subjects {
var equations: String
init(physics: String, equations: String) {
self.equations = equations
super.init(physics: physics)
}
}
class Maths: Subjects {
var formulae: String
init(physics: String, formulae: String) {
self.formulae = formulae
super.init(physics: physics)
}
}
// [AnyObject] 類(lèi)型的數(shù)組
let saprint: [AnyObject] = [
Chemistry(physics: "固體物理", equations: "赫茲"),
Maths(physics: "流體動(dòng)力學(xué)", formulae: "千兆赫"),
Chemistry(physics: "熱物理學(xué)", equations: "分貝"),
Maths(physics: "天體物理學(xué)", formulae: "兆赫"),
Maths(physics: "微分方程", formulae: "余弦級(jí)數(shù)")]
let samplechem = Chemistry(physics: "固體物理", equations: "赫茲")
print("實(shí)例物理學(xué)是: \(samplechem.physics)")
print("實(shí)例方程式: \(samplechem.equations)")
let samplemaths = Maths(physics: "流體動(dòng)力學(xué)", formulae: "千兆赫")
print("實(shí)例物理學(xué)是: \(samplemaths.physics)")
print("實(shí)例公式是: \(samplemaths.formulae)")
var chemCount = 0
var mathsCount = 0
for item in saprint {
// 類(lèi)型轉(zhuǎn)換的條件形式
if let show = item as? Chemistry {
print("化學(xué)主題是: '\(show.physics)', \(show.equations)")
// 強(qiáng)制形式
} else if let example = item as? Maths {
print("數(shù)學(xué)主題是: '\(example.physics)', \(example.formulae)")
}
}
var exampleany = [Any]()
exampleany.append(12)
exampleany.append(3.14159)
exampleany.append("Any 實(shí)例")
exampleany.append(Chemistry(physics: "固體物理", equations: "兆赫"))
for item2 in exampleany {
switch item2 {
case let someInt as Int:
print("整型值為 \(someInt)")
case let someDouble as Double where someDouble > 0:
print("Pi 值為 \(someDouble)")
case let someString as String:
print("\(someString)")
case let phy as Chemistry:
print("主題 '\(phy.physics)', \(phy.equations)")
default:
print("None")
}
}
/*
實(shí)例物理學(xué)是: 固體物理
實(shí)例方程式: 赫茲
實(shí)例物理學(xué)是: 流體動(dòng)力學(xué)
實(shí)例公式是: 千兆赫
化學(xué)主題是: '固體物理', 赫茲
數(shù)學(xué)主題是: '流體動(dòng)力學(xué)', 千兆赫
化學(xué)主題是: '熱物理學(xué)', 分貝
數(shù)學(xué)主題是: '天體物理學(xué)', 兆赫
數(shù)學(xué)主題是: '微分方程', 余弦級(jí)數(shù)
整型值為 12
Pi 值為 3.14159
Any 實(shí)例
主題 '固體物理', 兆赫
*/
在一個(gè)
switch
語(yǔ)句的case
中使用強(qiáng)制形式的類(lèi)型轉(zhuǎn)換操作符as
(而不是as?
)來(lái)檢查和轉(zhuǎn)換到一個(gè)明確的類(lèi)型(這是模式匹配姻锁,將在其他章節(jié)講解枕赵,這里記住如何使用即可)。