Swift 基础学习(可选类型深入探讨)

/* (1)深入研究可选类型 */
//可选类型是个枚举:有两种状态,一个是有值,一个是没有值nil
var opa: Int?//就相当于可选类型的简写
//等同于
var opb: Optional<Int>

//基本类型的变量,必须在使用之前先进行初始化
//作用:安全,因为不管我们在什么时候访问某个普通变量,它都是有意义的.
//普通变量的状态,只有一种: 有值
var a: Int
a = 10
print(opa)
print(opb)
print(a)

//基本类型变量的局限性,又制造了我们的可选类型

//可选类型是安全的吗?
//是安全的,在使用可选值解包时,我们要判断其是否有值,因为可选值有两种状态,一种是有值,一种是nil,所以要解包时我们要进行判断.
if let xa = opb {
    print(xa)
}
var data: NSData? = NSData(contentsOfFile: "/etc/passwd")
//print(data)

/* (2)可选链介绍 */
class Person {
    var name = ""
    func whoami() -> String {
        print("My name is \(name)")
        return name
    }
    init(name: String) {
        self.name = name
    }
}
var p0: Person?
var p1: Person = Person(name: "Tom")

p1.name = "zhangsan"
p1.whoami()

p0 = p1
//通过可选类型来调用相应的属性或者方法等
//第一种最方便,但是不安全
//p0!.name = "lisi"
//p0!.whoami()

//隐式的解包
if let t: Person = p0 {
    t.whoami()
    t.name = "lisi"
}
if p0 != nil {
    p0!.name = "lisi"
    p0!.whoami()
}
//可选链的方式
//可选链:通过可选类型的数据来请求调用相应的属性或者方法等的一种快捷方式
//如果有值调用会成功,如果没有则会失效,简洁而又方便
p0?.name = "lisi"
p0?.whoami()

/* (3)可选链的返回值 */
class Person1 {
    var name = ""
    func whoami() -> String {
        print("My name is \(name)")
        return name
    }
    init(name: String) {
        self.name = name
    }
}
var p2: Person?
var p3: Person = Person(name: "Tom")
p2 = p3

//通过可选链调用取得的返回值会被包装成一个可选类型的数据
//可选链有可能失效(nil),也有可能成功(返回值也会被包装成可选值).
let t: String? = p0?.name
let t1: String = p0!.name
print(p2?.name)
print(p2!.name)
//打印结果
//Optional("Tom")
//Tom

/* (4)通过可选链调用下标索引 */
//可选值?.属性
//可选值?.方法
//如何调用下标方法呢? 可选值?[参数]
class MyStringHash {
    subscript (x: String) -> Int {
        return x.hashValue - 1000
    }
}
var msh = MyStringHash()
var mshop: MyStringHash?
mshop = msh
print(msh["abc"])
print(mshop?["adc"])

var array: [Int]? = [1,2,3,4,5]
print(array?[0])

/* (5)可选链的赋值操作 */
class Person2 {
    var name = ""
    func whoami() -> String {
        print("My name is \(name)")
        return name
    }
    init(name: String) {
        self.name = name
    }
}
var p4: Person?
var p5: Person = Person(name: "Frank")
p4 = p5
//赋值操作
p4?.name = "Lisi"
print(p5.name)

//判断赋值操作是否成功,赋值操作也有返回值,可选值() == Void,nil
let res: Void? = (p4?.name = "Lisi")
print(res)
if (p4?.name = "Lisi") != nil {
    print("成功")
}

/* (6)多层链接的可选链 可选链:通过可选值调用可选值所属的类型的某些属性或方法的过程; 单层链接: a?.属性 多层链接: d.c?.b.a?.tag */
class A {
    var tag: String = ""
}
class B {
    var a: A?
}
class C {
    var b: B = B()
}
class D {
    var c: C?
}

var d = D()
var c = C()
var a1 = A()
a1.tag = "123dg"
d.c = c
d.c?.b.a = a1 //可选链
//当类型为可选类型时,需要在相应位置加?
print(d.c?.b.a?.tag)

你可能感兴趣的:(swift,可选类型)