您好,登錄后才能下訂單哦!
可選鏈
之前介紹過可選類型,再來深化一下可選鏈的概念
如下面的代碼,包含的符合關系:人—>寵物—>玩具
class Person {
var pet:Pet?
}
class Pet {
var name:String
var favorityToy:Toy?
init(name:String) {
self.name = name
}
func playToy() {
print("Pet \(self.name) play toy")
}
}
class Toy {
var name:String
init(name:String) {
self.name = name
}
}
Person的pet屬性可以為nil,Pet的屬性favorityToy可以為nil,這是有現實意義的
let p1 = Person()
print(p1.pet!.name)
由于p1.pet并沒有初始化,故為nil,在執行p1.pet!解封時,程序將崩潰(crash)
可選鏈的格式:串聯要訪問的屬性且在每個可選屬性后增加?
print(p1.pet?.favorityToy?.name) //nil
可選鏈的常見應用場景:
a. 可選鏈訪問屬性,如上面的代碼
b. 可選鏈訪問方法,如:
p1.pet?.playToy()
...
類型的轉換
先看三個類:
class Animal {
var age:Int = 1
}
class Dog : Animal {
var dogName:String?
}
class Cat : Animal {
var catName:String?
}
is 關鍵字 用于進行類型檢查,如:
var p:Animal = Dog()
if p is Dog {
print("是")
}
else {
print("不是")
}
as 用于繼承關系中的向上轉型
子類實例引用賦值給父類實例引用;其實直接賦值也是允許的
var d1:Dog = Dog()
var a1:Animal = d1 as Animal
as!/as? 用于繼承關系中的向下轉型
父類實例引用(引用的父類實例也可能引用子類實例)賦值給子類實例引用
as! 用于轉換一定成功的情況(進行了強解封),返回的不是可選類型
as? 用于轉換不一定成功的情況,返回的是可選類型
如:
var a1:Animal = Dog()
var d1:Dog? = a1 as? Dog
print(d1) //Optional(xxxx.Dog)
if let d2:Dog = a1 as? Dog {
print(d2) //xxxx.Dog
}
AnyObject:表示任意class類型的實例
var a:[AnyObject] = [10, 3.14 ,"hello"]
for var item in a {
if let a:Int = item as? Int {
print("整數:\(a)")
}
else if let a:Double = item as? Double {
print("浮點:\(a)")
}
else if let a:String = item as? String {
print("字符串:\(a)")
}
}
Any:表示任意類型,除了方法類型(函數類型)
var a = [Any]()
a.append(10)
a.append(3.14)
a.append("hello")
for var item in a {
if let a:Int = item as? Int {
print("整數:\(a)")
}
else if let a:Double = item as? Double {
print("浮點:\(a)")
}
else if let a:String = item as? String {
print("字符串:\(a)")
}
}
類型的嵌套
Swift允許在結構體、枚舉、類類型中嵌套定義結構體、枚舉、類類型
這樣做的好處是:方便組織代碼、一定程度上起到了命名空間的作用
如:
class A {
var name:String?
class C {
var name:String?
var age:Int?
}
}
class B {
var name:String?
class C {
var height:Double?
}
}
var p1:A.C = A.C()
var p2:B.C = B.C()
被嵌套的類,使用這種 . 方式表示
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。