Optional 学习日记
Optional在swift中表示出nil的方式Optional是一个枚举 有两个case
case none
case some(Wrapped)
.none == nil
Optional(Int)相当于 Int?
类型加问号是Optional的语法糖
Optional Binding 绑定的方式有3中
`if let`, `guard let`, and `switch`.
对于一个optional的值 要安全的访问其属性或者调用其方法 可以使用 ?. 的方式
let isPNG = A ?. Method
Unconditional Unwrapping
当确定一个optional值肯定不为nil
那么可以直接强制解包, 当强制解包失败 会抛出运行时错误
let number = Int("42")!
let isPNG = A!.
Methodnil-coalescing operator (`??`) 可组合使用
public func ??(optional: T?, defaultValue: @autoclosure () throws -> T) rethrows -> T {
switch optional {
case .some(let value):
return value
case .none:
return try defaultValue()
}
}
解包成功 直接返回解包后的值
解包失败 执行block 并且返回返回值(根据autoclosure 可见是通过block实现的)
let shapePath = 表达式A ?? 表达式B ?? 表达式C
//重载public func ??(optional: T?, defaultValue: @autoclosure () throws -> T?)
实现返回值可以是optional的 实现代码同上Map实现
public func map( _ transform: (Wrapped) throws -> U ) rethrows -> U? {
switch self {
case .some(let y):
return .some(try transform(y))
case .none:
return .none }
}
先解包 解包成功执行block 把返回值重新放进 .some先解包 解包失败直接返回 .
noneFlatMap 实现
public func flatMap( _ transform: (Wrapped) throws -> U? ) rethrows -> U? {
switch self {
case .some(let y):
return try transform(y)
case .none:
return .none }
}
先解包 解包成功执行block 直接返回block的返回值先解包 解包失败直接返回 .
nonepublic func ==(lhs: T?, rhs: T?) -> Bool
先解包 都解包失败返回true 至于一个解包成功返回false 都解包成功 返回解包后的值的比较结果
public func !=(lhs: T?, rhs: T?) -> Bool
返回==的结果 然后取反
//以下的几个函数 入参都有默认值 _OptionalNilComparisonType 这个值表示一个optional.none实际判断的时候并不会用到, 而是通过对另外一个入参解包的方式去实现的
public func ~=(lhs: _OptionalNilComparisonType, rhs: T?) -> Bool
使用switch的时候判断空的时候专用(不需要显示调用)
public func ==(lhs: T?, rhs: _OptionalNilComparisonType) -> Bool
实现 a==nil 的比较
public func !=(lhs: T?, rhs: _OptionalNilComparisonType) -> Bool
实现 a != nil 的比较
public func ==(lhs: _OptionalNilComparisonType, rhs: T?) -> Bool
实现 nil == a 的比较
public func !=(lhs: _OptionalNilComparisonType, rhs: T?) -> Bool
实现 nil != a 的比较
optional类型的桥接
optional实现了_ObjectiveCBridgeable协议
Swift转oc
public func _bridgeToObjectiveC() -> AnyObject {
// Bridge a wrapped value by unwrapping.
if let value = self {
return _bridgeAnythingToObjectiveC(value)
}
// Bridge nil using a sentinel.
return type(of: self)._nilSentinel
}
非空值解包后通过 _bridgeAnythingToObjectiveC 转换后返回
空值返回_nilSentinel
oc转Swift
有三种实现
第一种 强制转换
转换结果是nil 或缺 optional(optional())
第二种 条件转换
输入==nil 转换为 optional(.none)
输入 !=nil
输入 downcast 成功 转换为 .some(.some(value))
输入 downcast 失败 转换为 .none
第二种 无条件转换
先解包
解包失败 返回 nil
解包成功
判断解包后的值是不是==_nilSentinel
== 返回.none
!= 返回 .some(value) (value会被downcast转换为对应的值)