可選鏈
我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、城東ssl等。為成百上千企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的城東網(wǎng)站制作公司之前介紹過(guò)可選類型,再來(lái)深化一下可選鏈的概念
如下面的代碼,包含的符合關(guān)系:人—>寵物—>玩具
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,這是有現(xiàn)實(shí)意義的
let p1 = Person()
print(p1.pet!.name)
由于p1.pet并沒(méi)有初始化,故為nil,在執(zhí)行p1.pet!解封時(shí),程序?qū)⒈罎ⅲ╟rash)
可選鏈的格式:串聯(lián)要訪問(wèn)的屬性且在每個(gè)可選屬性后增加?
print(p1.pet?.favorityToy?.name) //nil
可選鏈的常見(jiàn)應(yīng)用場(chǎng)景:
a. 可選鏈訪問(wèn)屬性,如上面的代碼
b. 可選鏈訪問(wèn)方法,如:
p1.pet?.playToy()
...
類型的轉(zhuǎn)換
先看三個(gè)類:
class Animal {
var age:Int = 1
}
class Dog : Animal {
var dogName:String?
}
class Cat : Animal {
var catName:String?
}
is 關(guān)鍵字 用于進(jìn)行類型檢查,如:
var p:Animal = Dog()
if p is Dog {
print("是")
}
else {
print("不是")
}
as 用于繼承關(guān)系中的向上轉(zhuǎn)型
子類實(shí)例引用賦值給父類實(shí)例引用;其實(shí)直接賦值也是允許的
var d1:Dog = Dog()
var a1:Animal = d1 as Animal
as!/as? 用于繼承關(guān)系中的向下轉(zhuǎn)型
父類實(shí)例引用(引用的父類實(shí)例也可能引用子類實(shí)例)賦值給子類實(shí)例引用
as! 用于轉(zhuǎn)換一定成功的情況(進(jìn)行了強(qiáng)解封),返回的不是可選類型
as? 用于轉(zhuǎn)換不一定成功的情況,返回的是可選類型
如:
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類型的實(shí)例
var a:[AnyObject] = [10, 3.14 ,"hello"]
for var item in a {
if let a:Int = item as? Int {
print("整數(shù):\(a)")
}
else if let a:Double = item as? Double {
print("浮點(diǎn):\(a)")
}
else if let a:String = item as? String {
print("字符串:\(a)")
}
}
Any:表示任意類型,除了方法類型(函數(shù)類型)
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("整數(shù):\(a)")
}
else if let a:Double = item as? Double {
print("浮點(diǎn):\(a)")
}
else if let a:String = item as? String {
print("字符串:\(a)")
}
}
類型的嵌套
Swift允許在結(jié)構(gòu)體、枚舉、類類型中嵌套定義結(jié)構(gòu)體、枚舉、類類型
這樣做的好處是:方便組織代碼、一定程度上起到了命名空間的作用
如:
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()
被嵌套的類,使用這種 . 方式表示
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。