一起养成写作习惯!这是我参与「掘金日新计划 · 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
通过打印我们可以得知,当前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 类型。
- AnyClass: 代表任意实例的类型。
class ZGTeacher {
var age = 18
}
var t: AnyClass = ZGTeacher.self