Swift2.0(15)类型的补充

  • 可选链

之前介绍过可选类型,再来深化一下可选链的概念

     如下面的代码,包含的符合关系:人―>宠物―>玩具

    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()

     被嵌套的类,使用这种 . 方式表示


你可能感兴趣的:(ios,类,xcode,APP,swift,Swift2.0)