可选链
之前介绍过可选类型,再来深化一下可选链的概念
如下面的代码,包含的符合关系:人―>宠物―>玩具
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()
被嵌套的类,使用这种 . 方式表示