美文网首页
swift基础_空合并运算符??

swift基础_空合并运算符??

作者: 李永开 | 来源:发表于2023-03-15 10:41 被阅读0次

一. 什么是??

我们定义一个可选型的string做个测试

  • 使用三目运算符
var name: String?

//case name = nil
name = nil
print(name != nil ? name! : "name为nil") //name为nil

//case name != nil
name = "Jobs"
print(name != nil ? name! : "name为nil") //Jobs
  • 使用空合并运算符
var name: String?

//case name = nil
name = nil
print(name ?? "name为nil")               //name为nil

//case name != nil
name = "Jobs"
print(name ?? "name为nil")               //Jobs

发现??和三目运算符的功能是一样的,而且??使用更简单些

二. 真的这么简单吗?

定义两个函数

func getName(_ c: Character) -> String? {
    print("执行了getName")
    if c == "🐥" {
        return "蔡徐坤"
    }
    return nil
}
func getDefalutName() -> String{
    print("执行了getDefalutName")
    return "defalutName"
}
  • getName传入🐥,发现三目运算符打印了两次getName,而??只打印了一次。但是咱平时也不这么写,所以没啥区别,??能稍微简单点
//使用三目运算符
getName("🐥") != nil ? getName("🐥") : getDefalutName()
打印:
执行了getName
执行了getName

//使用??
getName("🐥") ?? getDefalutName()
打印:
执行了getName
  • getName传入"",执行结果一模一样😂
//使用三目运算符
getName("A") != nil ? getName("A") : getDefalutName()
打印:
执行了getName
执行了getDefalutName

//使用??
getName("A") ?? getDefalutName()
打印:
执行了getName
执行了getDefalutName

总结:??和三目运算符的功能是一模一样的

三.??的实现

3.1 咱们自己实现一个

震惊,左边不为nil,应该用左边的值, 但是也执行了右边的getDefalutName函数。
这编译期不太行呀。

// 中缀运算符, ??? 接受两边的参数, 左边为可选型, 右边为非可选型
infix operator ???
func ??? <T>(optional :T?, defaultValue: T) -> T{
    if let t = optional {
        return t
    }
    return defaultValue
}
getName("🐥") ??? getDefalutName()
打印:
执行了getName
执行了getDefalutName

3.2 测试下系统的

换成??试试, 发现系统的??发现坐边不为nil的时候,就不执行getDefalutName(),挺好的

getName("🐥") ?? getDefalutName()
打印:
执行了getName

看看系统的实现,发现系统使用了自动闭包, 那么我就懂了

//public func ?? <T>(optional: T?, defaultValue: @autoclosure () throws -> T?) rethrows -> T?

3.3 改进我们的???

咱们也加个自动闭包。看看结果,真好呀真好,和系统的??功能一样了

infix operator ???
func ??? <T>(optional :T?, defaultValue: @autoclosure () -> T) -> T{
    if let t = optional {
        return t
    }
    return defaultValue()
}
getName("🐥") ??? getDefalutName()
打印:
执行了getName

四.总结

  • 相同点:空和并运算符和三目运算符的功能基本一致
  • 不同点:空和并运算符只能用来判断前驱参数是否为nil,而三目运算符则更加强大些,能用来判断前驱参数是否为true。 所以??相当于?:的子集
  • 所以我们要根据情况适时选择到底该用他俩中的哪一个
  • 系统的??使用了自动闭包延迟了后继参数的执行时间,值得我们学习

相关文章

  • ★ iOS高级:Swift入门精讲③ 01 swift编程-09

    前言:本篇仅为视频学习笔记 空合并运算符 ?? (Nil-Coalescing Operator)上图是swift...

  • Swift 运算符

    合并空值运算符:?? 合并空值运算符(a ?? b) 如果可选项 a 有值则展开,如果没有值,是nil,则返回默认...

  • 理解php中的?:与??

    三元运算符(?:) php 5.3 空合并运算符(??)php 7

  • 合并空值运算符

    合并空值运算符 合并空值运算符(a ?? b):如果可选项 a 有值则展开,如果没有值,是nil,则返回默认值 b...

  • Optional:合并空值运算符

    合并空值运算符 合并空值运算符(a ?? b)如果可选项 a 有值则展开,如果没有值,是nil,则返回默认值 b...

  • C#高级编程

    简介 过一下基础东西,学习一下不常用的特性 命名参数&可选参数 可空类型 ?? :合并运算符 ?:可空类型 构造函...

  • 2.基本运算符[Basic Operators]

    [The Swift Programming Language 中文版]本页包含内容: 运算符是检查、改变、合并值...

  • Swift笔记二:基本运算符

    组合赋值运算符 Swift Objective-C Swift中复合赋值运算没有返回值。 元组比较大小 空合运算符...

  • Swift 浅谈

    空合并运算符 元祖 数组 字典 Set 运算符 while和repeat-while 条件循环结构 repeat ...

  • Swift 3.0学习笔记_3_运算符

    基础运算符,空合运算符,区间运算符,逻辑运算符

网友评论

      本文标题:swift基础_空合并运算符??

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