美文网首页
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 自定义操作符

    整理自 Swift4进阶 可选值操作

  • RxJava学习笔记之Single

    特点: 使用说明: 操作符: 操作符返回值说明composeSingle创建一个自定义的操作符concat and...

  • Currying Operator

    柯里化 操作符 可以直接重载+ - 乘操作符,在swift中有了这些操作符的定义,如果想自定义操作符,比如点乘+*...

  • Swift学习:操作符

    1.标准操作符 逻辑中还有||位操作符中还有| 2.重载操作符(操作符函数) 2.1.==可以针对自定义类型重载标...

  • Swift教程之基本操作符

    基本操作符 本章介绍Swift中的常见操作符,并介绍使用自定义操作符实现复杂运算。 术语 操作符包括一元、二元和三...

  • RxJava 反应式编程阅读笔记1 操作符 map

    操作符的含义其实就是函数,这也是 RxJava 强大之处,它有非常多的操作符支持各种场景,甚至可以自定义操作符。并...

  • Swift4 终极解析方案:进阶篇

    转载请注明,原文地址:Swift4 终极解析方案:进阶篇 自定义Key 基础篇里面已经介绍了使用CodingKey...

  • RxSwift文档六(单元测试)

    单元测试 测试自定义操作符 RxSwift用RxTest为所有操作符测试,位于Rx.xcworkspace项目内的...

  • Swift中的操作符

    1、…和..<2、??3、自定义操作符 1、…和..< Range操作符0…3:全闭合的范围操作,从0开始到3为止...

  • Swift4中Codable的使用(三)

    本篇是Swift4中Codable的使用系列第三篇,继续上一篇我们学习了如何自定义encode和decode,以及...

网友评论

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

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