可选类型扩展
extension Optional {
/// 可选值为空的时候返回 true
var isNone: Bool {
switch self {
case .none:
return true
case .some:
return false
}
}
/// 可选值非空返回 true
var isSome: Bool {
return !isNone
}
}
添加默认值
extension Optional {
/// 返回可选值或默认值
/// - 参数: 如果可选值为空,将会默认值
func or(_ default: Wrapped) -> Wrapped {
return self ?? `default`
}
/// 返回可选值或 `else` 表达式返回的值
/// 例如. optional.or(else: print("Arrr"))
func or(else: @autoclosure () -> Wrapped) -> Wrapped {
return self ?? `else`()
}
/// 返回可选值或者 `else` 闭包返回的值
// 例如. optional.or(else: {
/// ... do a lot of stuff
/// })
func or(else: () -> Wrapped) -> Wrapped {
return self ?? `else`()
}
/// 当可选值不为空时,返回可选值
/// 如果为空,抛出异常
func or(throw exception: Error) throws -> Wrapped {
guard let unwrapped = self else { throw exception }
return unwrapped
}
}
可选类型有值的时候执行闭包
extension Optional where Wrapped == Error {
/// 当可选值不为空时,执行 `else`
func or(_ else: (Error) -> Void) {
guard let error = self else { return }
`else`(error)
}
}
当可选类型当为 nil 或者 'some' 的时候执行闭包
extension Optional {
/// 当可选值不为空时,执行 `some` 闭包
func on(some: () throws -> Void) rethrows {
if self != nil { try some() }
}
/// 当可选值为空时,执行 `none` 闭包
func on(none: () throws -> Void) rethrows {
if self == nil { try none() }
}
}
// 事例
// 如果用户不存在将登出
self.user.on(none: { AppCoordinator.shared.logout() })
// 当用户不为空时,连接网络
self.user.on(some: { AppCoordinator.shared.unlock() })
设置一个期望值或者报错信息
extension Optional {
func expect(_ fatalErrorDescription:String) -> Wrapped {
guard let value = self else {
fatalError(fatalErrorDescription)
}
return value
}
}
// 事例
valueLabel.expect("期望存在值").text = state.title