美文网首页
Swift4 自定义操作符

Swift4 自定义操作符

作者: 黄二瓜 | 来源:发表于2017-12-28 16:44 被阅读39次

    整理自 Swift4进阶

    可选值操作

    infix operator ???: NilCoalescingPrecedence
    /// ??? 操作符
    /// 在字符串插值中使用可选值
    /// 这个函数接受左侧的可选值 T? 和右侧的字符串。如果可选值不是nil,我们将它解包,然后返回它的字符串描述。
    /// 否则,我们将传入的默认字符串返回
    ///
    ///     eg:
    ///     let bodyTemperature: Double? = 37.0
    ///     let bloodGlucose: Double? = nil
    ///     print("Body temperature: \(bodyTemperature ??? "n/a")")
    ///     //Body temperature: 37.0
    ///     print("Blood glucose level: \(bloodGlucose ??? "n/a")")
    ///     // Blood glucose level: n/a
    ///
    /// - Parameters:
    ///   - optional: 可选值
    ///   - defaultValue: 默认值(字符串)
    /// - Returns: 字符串
    func ???<T>(optional: T?, defaultValue: @autoclosure() -> String) -> String {
        switch optional {
        case let value?: return String(describing: value)
        case nil: return defaultValue()
        }
    }
    
    infix operator !!
    /// !! 操作符
    /// 强制解包失败时输入错误信息
    ///
    ///     eg:
    ///     let s = "foo"
    ///     let i = Int(s) !! "Expecting integer, got\"\(s)\""
    ///     // will print fatal error: Expecting integer, got"foo"
    ///
    /// - Parameters:
    ///   - wrapped: 可选值
    ///   - failureText: 错误信息
    /// - Returns: 被解包值
    func !!<T>(wrapped: T?, failureText: @autoclosure () -> String) -> T {
        if let x = wrapped { return x }
        fatalError(failureText())
    }
    
    infix operator !?
    /// !? 操作符
    /// 在调试版本中进行断言
    ///
    ///     eg:
    ///     let s = "2a"
    ///     let i = Int(s) !? (5, "Expected Integer")
    ///     // 调试版本中会触发断言 Expected Integer
    ///     // 发布版本中 i = 5
    ///
    /// 对失败的解包进行断言,并且在断言不触发的发布版本中将值替换为默认值
    /// - Parameters:
    ///   - wrapped: 可选值
    ///   - nilDefault: 解包失败断言操作
    /// - Returns: 解包成功的值或者解包失败的默认值
    func !?<T>(wrapped: T?, nilDefault:@autoclosure () -> (value: T, text: String)) -> T {
        assert(wrapped != nil, nilDefault().text)
        return wrapped ?? nilDefault().value
    }
    
    /// !? 操作符
    /// 对于返回 Void 的函数,使用可选链进行调用时将返回 Void?
    /// 通过 !? 操作符来检测一个可选链调用碰到 nil,且没有进行操作的情况
    ///
    ///     eg:
    ///     var output: String? = nil
    ///     output?.write("some thing") !? "Wasn't expecting chained nil here"
    ///     //assertion failed: Wasn't expecting chained nil here
    ///
    /// - Parameters:
    ///   - wrapped:
    ///   - failureText: 为nil且没有进行操作时的提示
    func !?(wrapped: ()?, failureText: @autoclosure () -> String) {
        assert(wrapped != nil, failureText)
    }
    

    相关文章

      网友评论

          本文标题:Swift4 自定义操作符

          本文链接:https://www.haomeiwen.com/subject/hqyvgxtx.html