swift 可选值详解4

284 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第28天,点击查看活动详情

与可选值有关的高阶函数

  • map : 这个方法接受一个闭包,如果可选值有内容则调用这个闭包进行转换。
var dict = ["one": "1", "two": "2"]
let result = dict["one"].map{ Int($0) }/// Optional(Optional(1))

上面的代码中我们从字典中取出字符串”1”,并将其转换为**Int类型,但因为String转换成 Int不一定能成功,所以返回的是Int? 类型,而且字典通过键不一定能取得到值,所以map** 返回的也是一个**Optional,所以最后上述代码result的类型为Int??** 类型。
那么如果要把我们的双重可选展平开来,这个时候我们就需要使用到

  • flatMap: 可以把结果展平成为单个可选值
var dict = ["one": "1", "two": "2"]
let result = dict["one"].flatMap{ Int($0) } /// Optional(1)
  • 注意,这个方法是作用在**Optioanl的方法,而不是作用在Sequence**上的。
  • 作用在Sequence上的**flatMap方法在Swift4.1中被更名为compactMap**,该方法可以将序列中的nil过滤出去。
let array = ["1", "2", "3", nil]
let result = array.compactMap{ $0 } // ["1", "2", "3"]

let array1 = ["1", "2", "3", "four"]
let result1 = array1.compactMap{ Int($0) } // [1, 2, 3]

元类型、AnyClass、Self (self)

  • AnyObject: 代表任意类的 instance,类的类型,仅遵守类的协议。
class ZGTeacher {
    var age = 18
}

var t = ZGTeacher()
var t1: AnyObject = t
var t2: AnyObject = ZGTeacher.self
  • T.self: T是实例对象,当前T.self返回的就是他本身;如果 T 是类,当前 T.self 返回的就是元类型。
class ZGTeacher {
    var age = 18
}

var t = ZGTeacher()

var t1 = t.self
var t2 = t.self.self
var t3 = ZGTeacher.self

lldb打印一下

(lldb) po t1
<ZGTeacher: 0x101c28fc0>

(lldb) po t2
<ZGTeacher: 0x101c28fc0>

(lldb) po t3
ZGTest.ZGTeacher
class ZGTeacher {
    var age = 18
}

var t = ZGTeacher()

var t1 = t.self

var t2 = t.self.self

var t3 = ZGTeacher.self

image.png

通过打印我们可以得知,当前t3存储的是我们的**metadata**,也就是元类型。

  • self:
class ZGTeacher {
    var age = 18
    func test() {
        ///当前实例对象
        print(self)
    }
    static func test1() {
        ///self 是 ZGTeacher 这个类型本身
        print(self)
    }
}
  • Self: Self 类型不是特定类型,⽽是让您⽅便地引⽤当前类型,⽽⽆需重复或知道该类型的名称。 在协议声明或协议成员声明中,Self 类型是指最终符合协议的类型。可作为⽅法的返回类型, 作为只读下标的返回类型,作为只读计算属性的类型。
class ZGTeacher {
    static let age = 18
    func test() -> Self {
        ///当前实例对象
        return self
    }
}

class ZGPerson {
    static let age = 0
    let age1 = age
    var age2 = age
    lazy var age3 = Self.age
}

protocol MyProtocol {
    func get() -> Self
}
  • Any: 代表任意类的实例,包括 funcation 类型或者 Optional 类型。

image.png

  • AnyClass: 代表任意实例的类型。
class ZGTeacher {
    var age = 18
}
var t: AnyClass = ZGTeacher.self