驗證一個實例的類型'類型轉換'在 Swift 語言編程中。它是用來檢查實例類型是否屬于特定超類或子類或其自己的層次結構定義。
Swift 類型轉換提供兩個操作符:“is” 檢查值的類型和 'as' 將類型值轉換為不同的類型值。 類型轉換還檢查實例類型是否符合特定的協議一致性標準。
定義一個類層次結構
類型轉換用于檢查實例的類型或者它屬于特定類型。此外,檢查類和它的子類層次結構來檢查并轉換這些實例,使之作為一個相同的層次結構。
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: "solid physics", equations: "Hertz"),
Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz")]
let samplechem = Chemistry(physics: "solid physics", equations: "Hertz")
println("Instance physics is: /(samplechem.physics)")
println("Instance equation is: /(samplechem.equations)")
let samplemaths = Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz")
println("Instance physics is: /(samplemaths.physics)")
println("Instance formulae is: /(samplemaths.formulae)")
當我們使用 playground 運行上面的程序,得到以下結果。
Instance physics is: solid physicsInstance equation is: HertzInstance physics is: Fluid DynamicsInstance formulae is: Giga Hertz
類型檢查
進行類型檢查,用 'is' 操作符。在 'is' 操作符檢查類型實例是否屬于特定的子類型,如果它屬于該實例返回“true”,否則將返回“false”。
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: "solid physics", equations: "Hertz"),
Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz"),
Chemistry(physics: "Thermo physics", equations: "Decibels"),
Maths(physics: "Astro Physics", formulae: "MegaHertz"),
Maths(physics: "Differential Equations", formulae: "Cosine Series")]
let samplechem = Chemistry(physics: "solid physics", equations: "Hertz")
println("Instance physics is: /(samplechem.physics)")
println("Instance equation is: /(samplechem.equations)")
let samplemaths = Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz")
println("Instance physics is: /(samplemaths.physics)")
println("Instance formulae is: /(samplemaths.formulae)")
var chemCount = 0
var mathsCount = 0
for item in sa {
if item is Chemistry {
++chemCount
} else if item is Maths {
++mathsCount
}
}
println("Subjects in chemistry contains /(chemCount) topics and maths contains /(mathsCount) topics")
當我們使用 playground 運行上面的程序,得到以下結果。
Instance physics is: solid physicsInstance equation is: HertzInstance physics is: Fluid DynamicsInstance formulae is: Giga HertzSubjects in chemistry contains 2 topics and maths contains 3 topics
向下轉換
向下類型轉換的子類型可以有兩個操作符(如:as? 和 as!)。as? 當值是nil,返回一個可選值。它是用來檢查成功向下轉型。
“as!” 返回強制解包裹,如可選鏈,向下轉換返回 nil 值。它用來觸發運行時錯誤在向下轉型出現故障時
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: "solid physics", equations: "Hertz"),
Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz"),
Chemistry(physics: "Thermo physics", equations: "Decibels"),
Maths(physics: "Astro Physics", formulae: "MegaHertz"),
Maths(physics: "Differential Equations", formulae: "Cosine Series")]
let samplechem = Chemistry(physics: "solid physics", equations: "Hertz")
println("Instance physics is: /(samplechem.physics)")
println("Instance equation is: /(samplechem.equations)")
let samplemaths = Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz")
println("Instance physics is: /(samplemaths.physics)")
println("Instance formulae is: /(samplemaths.formulae)")
var chemCount = 0
var mathsCount = 0
for item in sa {
if let print = item as? Chemistry {
println("Chemistry topics are: '/(print.physics)', /(print.equations)")
} else if let example = item as? Maths {
println("Maths topics are: '/(example.physics)', /(example.formulae)")
}
}
當我們使用 playground 運行上面的程序,得到以下結果。
Instance physics is: solid physicsInstance equation is: HertzInstance physics is: Fluid DynamicsInstance formulae is: Giga HertzChemistry topics are: 'solid physics', HertzMaths topics are: 'Fluid Dynamics', Giga HertzChemistry topics are: 'Thermo physics', DecibelsMaths topics are: 'Astro Physics', MegaHertzMaths topics are: 'Differential Equations', Cosine Series
類型轉換:任何與任何對象
為了表示實例屬于任何類型包括函數類型,使用“Any”關鍵字
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: "solid physics", equations: "Hertz"),
Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz"),
Chemistry(physics: "Thermo physics", equations: "Decibels"),
Maths(physics: "Astro Physics", formulae: "MegaHertz"),
Maths(physics: "Differential Equations", formulae: "Cosine Series")]
let samplechem = Chemistry(physics: "solid physics", equations: "Hertz")
println("Instance physics is: /(samplechem.physics)")
println("Instance equation is: /(samplechem.equations)")
let samplemaths = Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz")
println("Instance physics is: /(samplemaths.physics)")
println("Instance formulae is: /(samplemaths.formulae)")
var chemCount = 0
var mathsCount = 0
for item in sa {
if let print = item as? Chemistry {
println("Chemistry topics are: '/(print.physics)', /(print.equations)")
} else if let example = item as? Maths {
println("Maths topics are: '/(example.physics)', /(example.formulae)")
}
}
var exampleany = [Any]()
exampleany.append(12)
exampleany.append(3.14159)
exampleany.append("Example for Any")
exampleany.append(Chemistry(physics: "solid physics", equations: "Hertz"))
for print in exampleany {
switch print {
case let someInt as Int:
println("Integer value is /(someInt)")
case let someDouble as Double where someDouble > 0:
println("Pi value is /(someDouble)")
case let someString as String:
println("/(someString)")
case let phy as Chemistry:
println("Topics '/(phy.physics)', /(phy.equations)")
default:
println("None")
}
}
當我們使用 playground 運行上面的程序,得到以下結果。
Instance physics is: solid physicsInstance equation is: HertzInstance physics is: Fluid DynamicsInstance formulae is: Giga HertzChemistry topics are: 'solid physics', HertzMaths topics are: 'Fluid Dynamics', Giga HertzChemistry topics are: 'Thermo physics', DecibelsMaths topics are: 'Astro Physics', MegaHertzMaths topics are: 'Differential Equations', Cosine SeriesInteger value is 12Pi value is 3.14159Example for AnyTopics 'solid physics', HertzAnyObject
為了表示是任何類型的類實例,使用AnyObject“關鍵字
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 saprint: [AnyObject] = [Chemistry(physics: "solid physics", equations: "Hertz"),
Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz"),
Chemistry(physics: "Thermo physics", equations: "Decibels"),
Maths(physics: "Astro Physics", formulae: "MegaHertz"),
Maths(physics: "Differential Equations", formulae: "Cosine Series")]
let samplechem = Chemistry(physics: "solid physics", equations: "Hertz")
println("Instance physics is: /(samplechem.physics)")
println("Instance equation is: /(samplechem.equations)")
let samplemaths = Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz")
println("Instance physics is: /(samplemaths.physics)")
println("Instance formulae is: /(samplemaths.formulae)")
var chemCount = 0
var mathsCount = 0
for item in saprint {
if let print = item as? Chemistry {
println("Chemistry topics are: '/(print.physics)', /(print.equations)")
} else if let example = item as? Maths {
println("Maths topics are: '/(example.physics)', /(example.formulae)")
}
}
var exampleany = [Any]()
exampleany.append(12)
exampleany.append(3.14159)
exampleany.append("Example for Any")
exampleany.append(Chemistry(physics: "solid physics", equations: "Hertz"))
for print in exampleany {
switch print {
case let someInt as Int:
println("Integer value is /(someInt)")
case let someDouble as Double where someDouble > 0:
println("Pi value is /(someDouble)")
case let someString as String:
println("/(someString)")
case let phy as Chemistry:
println("Topics '/(phy.physics)', /(phy.equations)")
default:
println("None")
}
}
當我們使用 playground 運行上面的程序,得到以下結果。
Instance physics is: solid physicsInstance equation is: HertzInstance physics is: Fluid DynamicsInstance formulae is: Giga HertzChemistry topics are: 'solid physics', HertzMaths topics are: 'Fluid Dynamics', Giga HertzChemistry topics are: 'Thermo physics', DecibelsMaths topics are: 'Astro Physics', MegaHertzMaths topics are: 'Differential Equations', Cosine SeriesInteger value is 12Pi value is 3.14159Example for AnyTopics 'solid physics', Hertz