zoukankan      html  css  js  c++  java
  • Swift中空合运算符、闭区间运算符、单侧区间、半开区间

    空合运算符(Nil Coalescing Operator)

    用于取代3目判空运算,提供超短的写法
    比如常规判空写法如下,反正我写java就是这么干的

    var anOptionalInt: Int? = 10
    
    var anInt: Int = 0
    
    if anOptionalInt != nil {
    anInt = anOptionalInt!
    }

    空合运算符(a ?? b)将对可选类型 a 进行空判断,如果 a 包含一个值就进行解封,否则就返回一个默认值 b。表达式 a 必须是 Optional 类型。默认值 b 的类型必须要和 a 存储值的类型保持一致。

    空合运算符是对以下代码的简短表达方法:

    a != nil ? a! : b

    上述代码使用了三元运算符。当可选类型 a 的值不为空时,进行强制解封(a!),访问 a 中的值;反之返回默认值 b。无疑空合运算符(??)提供了一种更为优雅的方式去封装条件判断和解封两种行为,显得简洁以及更具可读性。

    下文例子采用空合运算符,实现了在默认颜色名和可选自定义颜色名之间抉择:

    let defaultColorName = "red"
    var userDefinedColorName: String? //默认值为 nil
    
    var colorNameToUse = userDefinedColorName ?? defaultColorName
    // userDefinedColorName 的值为空,所以 colorNameToUse 的值为 "red"

    userDefinedColorName 变量被定义为一个可选的 String 类型,默认值为 nil。由于 userDefinedColorName 是一个可选类型,我们可以使用空合运算符去判断其值。在上一个例子中,通过空合运算符为一个名为 colorNameToUse 的变量赋予一个字符串类型初始值。 由于 userDefinedColorName 值为空,因此表达式 userDefinedColorName ?? defaultColorName 返回 defaultColorName 的值,即 red。

    闭区间运算符


    区间运算用于循环,闭区间意思是全部范围都需要,用于替代(i>=1 && i<=5)

    for index in 1...5 {
    print("(index) * 5 = (index * 5)")
    }
    // 1 * 5 = 5
    // 2 * 5 = 10
    // 3 * 5 = 15
    // 4 * 5 = 20
    // 5 * 5 = 25

    半开区间运算符


    半开区间运算符(a..<b)定义一个从 a 到 b 但不包括 b 的区间。 之所以称为半开区间,是因为该区间包含第一个值而不包括最后的值。

    半开区间的实用性在于当你使用一个从 0 开始的列表(如数组)时,非常方便地从0数到列表的长度。

    let names = ["Anna", "Alex", "Brian", "Jack"]
    let count = names.count
    for i in 0..<count {
    print("第 (i + 1) 个人叫 (names[i])")
    }
    // 第 1 个人叫 Anna
    // 第 2 个人叫 Alex
    // 第 3 个人叫 Brian
    // 第 4 个人叫 Jack

    数组有 4 个元素,但 0..<count 只数到3(最后一个元素的下标),因为它是半开区间。

    单侧区间

    闭区间操作符有另一个表达形式,可以表达往一侧无限延伸的区间 —— 例如,一个包含了数组从索引 2 到结尾的所有值的区间。在这些情况下,你可以省略掉区间操作符一侧的值。这种区间叫做单侧区间,因为操作符只有一侧有值。例如:

    for name in names[2...] {
    print(name)
    }
    // Brian
    // Jack
    
    for name in names[...2] {
    print(name)
    }
    // Anna
    // Alex
    // Brian

    半开区间操作符也有单侧表达形式,附带上它的最终值。就像你使用区间去包含一个值,最终值并不会落在区间内。例如:

    for name in names[..<2] {
    print(name)
    }
    // Anna
    // Alex
  • 相关阅读:
    描述一下Spring Bean的生命周期
    BeanFactory和ApplicationContext有什么区别
    谈谈你对AOP的理解
    谈谈对IOC的理解
    线程池中线程复用原理
    线程池中阻塞队列的最用?为什么是先添加队列而不是先创建最大线程
    为什么使用线程池?解释下线程池参数
    去噪声论文阅读
    怎么使用有三AI完成系统性学习
    JavaCnn项目注解
  • 原文地址:https://www.cnblogs.com/starcrm/p/9961905.html
Copyright © 2011-2022 走看看