Swift 可选类型的扩展

可选类型扩展

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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容