zoukankan      html  css  js  c++  java
  • Swift3.0P1 语法指南——基本操作符

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/BasicOperators.html#//apple_ref/doc/uid/TP40014097-CH6-ID60

    关于基本操作符

    Swift支持大多数的标准C操作符,也改进了其中一些能力以避免常见的编写错误。

    例如,等号=并不返回一个值,以避免想用==时发生误写。运算符号(+, -, *, /, %等)会检查值的溢出并且不允许溢出,避免产生的结果超出值类型存储范围。

    Swift还提供了两个范围操作符(a..<b和a...b)。

    1、赋值

    1 let b = 10
    2 var a = 5
    3 a = b
    4 // a is now equal to 10

    如果赋值的右边是一个多元组, 它的元素可以马上被分解多个变量或变量:

    1 let (x, y) = (1, 2)
    2 // x is equal to 1, and y is equal to 2

    与C语言和Objective-C不同, Swift的赋值操作并不返回任何值. 所以以下代码是错误的:

    1 if x = y {
    2     // this is not valid, because x = y does not return a value
    3 }

    这个特性使得你无法把==错写成=, 由于if x = y是错误代码, Swift从底层帮你避免了这些代码错误.

    2、算术运算符

    1 1 + 2       // equals 3
    2 5 - 3       // equals 2
    3 2 * 3       // equals 6
    4 10.0 / 2.5  // equals 4.0

    与C语言和Objective-C不同的是, Swift默认不允许在数值运算中出现溢出情况. 但你可以使用Swift的溢出运算符来达到你有目的的溢出, (如 a &+ b ).

    加法操作 + 也用于字符串的拼接: 

    "hello, " + "world"  // equals "hello, world"

    3、取余运算符

    1 9 % 4   // equals 1
    2 -9 % 4   // equals -1

    求余时, b的符号会被忽略。这意味着 a % b 和 a % -b的结果是相同的.

    浮点求余:

    1 8 % 2.5   // equals 0.5

    注意:Swift3.0版本没有++和--运算符了。

    简单的说,这两条命令没有存在的必要了,详细原因请见:Remove the ++ and -- operators

    4、自增/自减运算符

    i++、i--、++i、--i

    与C语言中的运算符特性相同。

    除非你需要使用 i++ 的特性, 不然推荐你使用 ++i 和 --i, 因为先修改后返回这样的行为更符合我们的逻辑.

    4、单目负号

    1 let three = 3
    2 let minusThree = -three       // minusThree equals -3
    3 let plusThree = -minusThree   // plusThree equals 3, or "minus minus three"

    单目负号写在操作数之前, 中间没有空格.

    5、单目正号

    单目正号就直接返回操作数的值.

    let minusSix = -6
    let alsoMinusSix = +minusSix  // alsoMinusSix equals -6

    6、复合赋值

    同C语言。

    1 var a = 1
    2 a += 2
    3 // a is now equal to 3

    注意,复合赋值并没有返回一个值,例如,不能写成 let b = a += 2

    7、比较运算符

    1 == 1   // true, because 1 is equal to 1
    2 != 1   // true, because 2 is not equal to 1
    2 > 1    // true, because 2 is greater than 1
    1 < 2    // true, because 1 is less than 2
    1 >= 1   // true, because 1 is greater than or equal to 1
    2 <= 1   // false, because 2 is not less than or equal to 1

    比较运算符经常用于控制语句,例如:

    let name = "world"
    if name == "world" {
       print("hello, world")
    } else {
       print("I'm sorry (name), but I don't recognize you")
    }
    // Prints "hello, world", because name is indeed equal to "world".

    也可以比较两个元组,只要它们元素数目相同,并且对应元素可以相互比较。

    (1, "zebra") < (2, "apple")   // true because 1 is less than 2
    (3, "apple") < (3, "bird")    // true because 3 is equal to 3, and "apple" is less than "bird"
    (4, "dog") == (4, "dog")      // true because 4 is equal to 4, and "dog" is equal to "dog"

    注意:Swift的标准库只能比较少于7个元素的元组,如果需要比较更多元素,你需要自己实现比较运算符。

    8、三目条件运算符

    1 let contentHeight = 40
    2 let hasHeader = true
    3 let rowHeight = contentHeight + (hasHeader ? 50 : 20)
    4 // rowHeight is equal to 90

    相当于以下代码:

    1 let contentHeight = 40
    2 let hasHeader = true
    3 var rowHeight = contentHeight
    4 if hasHeader {
    5     rowHeight = rowHeight + 50
    6 } else {
    7     rowHeight = rowHeight + 20
    8 }
    9 // rowHeight is equal to 90

    三目条件运算提供有效便捷的方式来表达二选一的选择. 需要注意的是, 过度使用三目条件运算就会由简洁的代码变成难懂的代码. 我们应避免在一个组合语句使用多个三目条件运算符.

    9、Nil合并运算符

     a ?? b

    如果可选值a有值,则将其解包。反之,如果a等于nil,则返回默认值b。其中,a总是一个可选型的值,b则是一个与a解包的值类型一致的值。

    上面的表达式可以看做下列表达式的缩写版:

     a != nil ? a! : b

    下面的例子,用nil合并运算符来作默认颜色和用户自定义颜色之间的选择。

    如果提供的自定义颜色名为空,则返回默认颜色。

    1 let defaultColorName = "red"
    2 var userDefinedColorName: String?   // defaults to nil
    3  
    4 var colorNameToUse = userDefinedColorName ?? defaultColorName
    5 // userDefinedColorName is nil, so colorNameToUse is set to the default of "red"

    如果自定义的颜色存在(名字符合要求),则返回自定义颜色。

    1 userDefinedColorName = "green"
    2 colorNameToUse = userDefinedColorName ?? defaultColorName
    3 // userDefinedColorName is not nil, so colorNameToUse is set to "green"

    10、区间运算符

    (1)闭区间运算符

    a...b 声明了一个包含a和b的值的闭区间。a必须不大于b。

    1 for index in 1...5 {
    2     print("(index) times 5 is (index * 5)")
    3 }
    4 // 1 times 5 is 5
    5 // 2 times 5 is 10
    6 // 3 times 5 is 15
    7 // 4 times 5 is 20
    8 // 5 times 5 is 25

    (2)半开区间运算符

    a..<b 声明了一个包含a但不包含b的半开半闭区间。a的值必须不大于b。如果a等于b,则该区间为空。

    1 let names = ["Anna", "Alex", "Brian", "Jack"]
    2 let count = names.count
    3 for i in 0..<count {
    4     print("Person (i + 1) is called (names[i])")
    5 }
    6 // Person 1 is called Anna
    7 // Person 2 is called Alex
    8 // Person 3 is called Brian
    9 // Person 4 is called Jack

    11、逻辑运算符

    (1)逻辑非

    1 let allowedEntry = false
    2 if !allowedEntry {
    3     print("ACCESS DENIED")
    4 }
    5 // prints "ACCESS DENIED"

    (2)逻辑与

    1 let enteredDoorCode = true
    2 let passedRetinaScan = false
    3 if enteredDoorCode && passedRetinaScan {
    4     print("Welcome!")
    5 } else {
    6     print("ACCESS DENIED")
    7 }
    8 // prints "ACCESS DENIED"

    (3)逻辑或

    1 let hasDoorKey = false
    2 let knowsOverridePassword = true
    3 if hasDoorKey || knowsOverridePassword {
    4     print("Welcome!")
    5 } else {
    6     print("ACCESS DENIED")
    7 }
    8 // prints "Welcome!"

    (4)组合逻辑

    1 if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
    2     print("Welcome!")
    3 } else {
    4     print("ACCESS DENIED")
    5 }
    6 // prints "Welcome!"

    (5)显式括号增加可读性

    1 if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
    2     print("Welcome!")
    3 } else {
    4     print("ACCESS DENIED")
    5 }
    6 // prints "Welcome!"
  • 相关阅读:
    Package manager has died异常PackageInfo 引发 Crash
    Android Bitmap变迁与原理解析(4.x-8.x)
    Rxjava2不能再发射Null了
    [转]C语言的int最值问题,以及原码反码及补码
    自定义gradle插件
    ReentrantLock(重入锁)的使用
    HashSet、TreeSet和LinkedHashSet分别基于HashMap、TreeMap和LinkedHashMap
    Java类加载双亲委托模式优点
    为什么HTTPS比HTTP安全,以及两者的优缺点
    android4.4之后的HttpUrlConnection的实现是基于okhttp
  • 原文地址:https://www.cnblogs.com/tt2015-sz/p/4860778.html
Copyright © 2011-2022 走看看