swift 学习笔记

来源:互联网 发布:淘宝潮女装店铺排行榜 编辑:程序博客网 时间:2024/05/21 07:12

在声明函数的时候, 我们也可以这么去声明

<code class="hljs livecodeserver has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">func sumOf(numbers:Int...) -> Int {    var <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">sum</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">number</span> <span class="hljs-operator" style="box-sizing: border-box;">in</span> numbers {        <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">sum</span> += <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">number</span>    }    <span class="hljs-constant" style="box-sizing: border-box;">return</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">sum</span>}println(sumOf(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>))<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: 6</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>

PS: “Int…”是数组的意思.

func makeIncrementer() ->(Int -> Int) { func addOne(number:Int) -> Int {return1 + number } return addOne}var increment = makeIncrementer()println(increment(7))// 打印出来的结果: 8 返回类型是 一个函数


func hasAnyMatches(list: [Int], condition : Int -> Bool) -> Bool {for item in list { if condition(item) { returntrue } } returnfalse}func lessThanTen(number: Int) -> Bool { return number < 10}var numbers = [20,19,7,12]println(hasAnyMatches(numbers, lessThanTen))// 打印出来的结果: true

函数当作参数


闭包的声明以及简单运用

<code class="hljs javascript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> names = [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Chris"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Alex"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Ewa"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Barry"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Daniella"</span>]func backwards(s1: <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">String</span>, s2: <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">String</span>) -> Bool {        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> s1 > s2}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> reversed = sorted(names, backwards)println(reversed)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: [Ewa, Daniella, Chris, Barry, Alex]</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>

PS: 在Sort是默认没有返回值的, 而Sorted的返回值是倒序排列.


这里有个官方的例子:

<code class="hljs coffeescript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">func hasAnyMatches1<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(list:[Int], condition:Int -> Bool)</span> -></span> Bool {    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> item <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> list {        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> condition(item){            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">true</span>        }    }    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">false</span>}func lessThanTen1<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(number: Int)</span> -></span> Bool {    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> number < <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>}<span class="hljs-reserved" style="box-sizing: border-box;">var</span> numbers1 = [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">20</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">12</span>]println(hasAnyMatches1(numbers1, lessThanTen1))<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">//</span> 打印出来的结果: <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">true</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>
<code class="hljs livecodeserver has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">numbers1.map({    (<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">number</span>: Int) -> Int <span class="hljs-operator" style="box-sizing: border-box;">in</span>    let <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">result</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span> * <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">number</span>    <span class="hljs-constant" style="box-sizing: border-box;">return</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">result</span>})let mappedNumbers = numbers1.map({    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">number</span> <span class="hljs-operator" style="box-sizing: border-box;">in</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span> * <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">number</span>})println(mappedNumbers)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: [60, 27, 21, 36]</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul>
<code class="hljs bash has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">let</span> sortedNumbers = sorted(numbers1) {<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$0</span> > <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$1</span>}println(sortedNumbers)// 打印出来的结果: [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">20</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">12</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>]</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

PS: Sorted默认的排序是从小到大, 但是在sorted()后面加上{0>1}这句代码, 那么就会根据我们缩写的判断来进行排序.



3.Getter方法和Setter方法

<code class="hljs actionscript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">EquilateralTriangle</span>: <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">NamedShape</span>{</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> sideLength: Double = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.0</span>    init (sideLength: Double, name:String) {        self.sideLength = sideLength        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">super</span>.init(name: name)        numberOfSides = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>    }    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> perimeter: Double {        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">get</span> {            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3.0</span> * sideLength        }        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">set</span> {            sideLength = newValue / <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3.0</span>        }    }    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">override</span> func simpleDescription() -> String {        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"A shape with ​\(numberOfSides)​ sides."</span>    }}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> triangle = EquilateralTriangle(sideLength: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3.1</span>, name: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"a triangle"</span>)triangle.perimeter = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9.9</span>triangle.sideLength = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.0</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> a = triangle.perimeter<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> b = triangle.sideLengthprintln(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"\(a), \(b),\(triangle.simpleDescription())"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: 3.0, 1.0,A shape with ​3​ sides.</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li></ul>

PS: 在例子里面, perimeter在set方法里面对应的是newValuew, 它的运算也是在这里.


4.willSet和didSet

在前面, 如果我们需要运算某些特定的值, 就是用getter和setter, 如果不需要运算的话, 就使用willSet和didSet:

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">class TriangleAndSquare {    var triangle: EquilateralTriangle {        willSet {            square<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.sideLength</span> = newValue<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.sideLength</span>        }    }    var square: Square {        willSet {            triangle<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.sideLength</span> = newValue<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.sideLength</span>        }    }    init(size: Double, name:String){        square = Square(sideLength: size, name: name)        triangle = EquilateralTriangle(sideLength: size, name: name)    }}var triangleAndSquare = TriangleAndSquare(size: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>, name: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"another test shape"</span>)println(triangleAndSquare<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.square</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.sideLength</span>)println(triangleAndSquare<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.triangle</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.sideLength</span>)triangleAndSquare<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.square</span> = Square(sideLength: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">59</span>, name: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"larger square"</span>)println(triangleAndSquare<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.triangle</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.sideLength</span>)// 打印出来的结果: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10.0</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10.0</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">59.0</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li></ul>

5.函数的参数 
在Swift中, 函数的声明可以加参数也可以不加参数, 如果加了参数, 在调用时就必须以显式声明, 第一个参数除外:

<code class="hljs haskell has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">Counter</span> {    var count: <span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">Int</span> = 0    func incrementBy<span class="hljs-container" style="box-sizing: border-box;">(<span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">amount</span>: <span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">Int</span>, <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">numberOfTimes</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">times</span>: <span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">Int</span>)</span>{        count += amount * times        println<span class="hljs-container" style="box-sizing: border-box;">(<span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">count</span>)</span>    }}var counter = <span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">Counter</span><span class="hljs-container" style="box-sizing: border-box;">()</span>counter.incrementBy<span class="hljs-container" style="box-sizing: border-box;">(2, <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">numberOfTimes</span>:7)</span>// 打印出来的结果: 14</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul>

6.关于可选符号 “?”

<code class="hljs cs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> optionalSquare: Square? = Square(sideLength: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.5</span>, name: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"optional square"</span>)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> sideLength = optionalSquare?.sideLengthprintln(sideLength)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: Optional(2.5)</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>

PS: 可选符 “?” 的意思是, 如果在可选符之前的值是空的, 那么就会返回nil, 后面的东西就不会理会, 如果返回的值非空, 那么后面的值才会有效.

1.枚举的声明及使用

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">enum Rank: Int {    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> Ace <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> Two, Three, Four, Five, Six, Seven, Eight, Nine, ten    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> Jack, Queen, King    func simpleDescription() <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-> </span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">String</span> {        switch <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">self</span>{        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>Ace:            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"ace"</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>Jack:            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"jack"</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>Queen:            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"queen"</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>King:            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"King"</span>        default:            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">String</span>(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">self</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>rawValue)        }    }}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> ace <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> Rank<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>King<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> aceRawValue <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> ace<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>rawValueprintln(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"\(ace), \(aceRawValue)"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: (Enum Value), 13</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li></ul>

PS: 这里解释一下, 枚举类型第一个开始的参数都是1, 无论你是有多少case, 都会递增的, 比如例子的的Ace是1, 那么Two就是名副其实的2, Three就是3, 以此类推, 一直到King, 就是13, 而enum里面有一个方法, 这里面这个方法只是说可以在enum里定义方法, 但我这个例子并没有使用.


2.枚举类型内添加Func方法以及Enum的时值

<code class="hljs coffeescript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-reserved" style="box-sizing: border-box;">enum</span> Suit {    <span class="hljs-reserved" style="box-sizing: border-box;">case</span> Spades, Hearts, Diamonds, Clubs    <span class="hljs-reserved" style="box-sizing: border-box;">case</span> a    func simpleDescription<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span> -></span> String {        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">switch</span> self{        <span class="hljs-reserved" style="box-sizing: border-box;">case</span> .<span class="hljs-attribute" style="box-sizing: border-box; color: rgb(0, 136, 0);">Spades</span>:            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"spades"</span>        <span class="hljs-reserved" style="box-sizing: border-box;">case</span> .<span class="hljs-attribute" style="box-sizing: border-box; color: rgb(0, 136, 0);">Hearts</span>:            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"hearts"</span>        <span class="hljs-reserved" style="box-sizing: border-box;">case</span> .<span class="hljs-attribute" style="box-sizing: border-box; color: rgb(0, 136, 0);">Diamonds</span>:            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"diamonds"</span>        <span class="hljs-reserved" style="box-sizing: border-box;">case</span> .<span class="hljs-attribute" style="box-sizing: border-box; color: rgb(0, 136, 0);">Clubs</span>:            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"clubs"</span>        <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(0, 136, 0);">default</span>:            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"a"</span>        }    }}<span class="hljs-reserved" style="box-sizing: border-box;">let</span> hearts = Suit.Hearts<span class="hljs-reserved" style="box-sizing: border-box;">let</span> heartsDescription = hearts.simpleDescription()<span class="hljs-reserved" style="box-sizing: border-box;">let</span> spades = Suit.Spades.hashValue<span class="hljs-reserved" style="box-sizing: border-box;">let</span> a = Suit.a.hashValueprintln(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"spades is \(spades),a is \(a),\(heartsDescription)"</span>)<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">//</span> 打印出来的结果:spades <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">is</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, a <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">is</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>, hearts</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li></ul>

PS: 看到例子中, 我们知道enum是有时值的, 这个时值是从0 开始, 一直到最后一位, 而且不受enum里面有多少个case影响.


3.结构体的声明和使用

<code class="hljs coffeescript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">struct Card {    <span class="hljs-reserved" style="box-sizing: border-box;">var</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(0, 136, 0);">rank</span>: Rank    <span class="hljs-reserved" style="box-sizing: border-box;">var</span> suit : Suit    func simpleDescription<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span> -></span> String {        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"The \(rank.simpleDescription()) of \(suit.simpleDescription())"</span>    }}<span class="hljs-reserved" style="box-sizing: border-box;">let</span> threeOfSpades = Card(<span class="hljs-attribute" style="box-sizing: border-box; color: rgb(0, 136, 0);">rank</span>: .Three, <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(0, 136, 0);">suit</span>: .Spades)<span class="hljs-reserved" style="box-sizing: border-box;">let</span> threeOfSpadesDescription = threeOfSpades.simpleDescription()println(threeOfSpadesDescription)<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">//</span> 打印出来的结果: The <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">of</span> spades</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li></ul>

PS: 结构体里面同样是可以嵌套Func方法使用.


4.使用枚举类型获取时间

<code class="hljs javascript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">enum ServerResponse{    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> Result(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">String</span>, <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">String</span>)    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">Error</span>(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">String</span>)}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> success = ServerResponse.Result(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"8:00 am"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"18:00"</span>)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> failure = ServerResponse.Error(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Out of cheese"</span>)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">switch</span> success {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> .Result(sunrise, sunset):    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> serverResponse = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Sunriseis at \(sunrise) and sunset is at \(sunset)."</span>    println(serverResponse)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> .Error(error):    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> serverResponse = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Failure... \(error)"</span>    println(serverResponse)}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: Sunriseis at 8:00 am and sunset is at 18:00.</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li></ul>

PS: 在case let .Result()里面的sunrise和sunset是我们自己定义的, 这个可以根据个人爱好随意声明, 但如果是团队开发的话, 那就不要随便写了, 你懂的~


1.声明Protocol

<code class="hljs cs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">protocol ExampleProtocol{    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> simpleDescription: String {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">get</span>}    mutating func adjust()}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

PS: 在声明协议的时候, 如果你要修改某个方法属性, 你必须的在该方法前加上mutating这个关键字, 否则不能修改.


2.使用Protocol

<code class="hljs javascript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> SimpleClass: ExampleProtocol {    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> simpleDescription: <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">String</span> = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"A very simple class."</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> anotherProperty: Int = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">69105</span>    func adjust() {        simpleDescription += <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" Now 100% adjusted."</span>    }}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> a = SimpleClass()a.adjust()<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> aDescription = a.simpleDescriptionprintln(aDescription)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果是: A very simple class. Now 100% adjusted.</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>

同样的, 在结构体里一样可以使用, 但是必须的加上mutating:

<code class="hljs go has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">struct</span> SimpleStructure:ExampleProtocol {    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> simpleDescription: String = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"A simple structure."</span>    mutating <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">func</span> adjust() {        simpleDescription += <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" (adjusted)"</span>    }}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> b = SimpleStructure()b.adjust()let bDescription = b.simpleDescription<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(bDescription)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果是: A simple structure. (adjusted)</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li></ul>

Protocol也可以这么使用:

<code class="hljs coffeescript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-reserved" style="box-sizing: border-box;">let</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(0, 136, 0);">protocolValue</span>:ExampleProtocol = aprintln(protocolValue.simpleDescription)<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">//</span> 打印出来的结果:A very simple <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span>. <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Now</span> 100% <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">adjusted</span>.</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

PS: 这里的a是前面例子里面的a.


3.声明Extensions

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">extension Int: ExampleProtocol {    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">var</span> simpleDescription: <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">String</span> {        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"The number \(self)"</span>    }    mutating func adjust() {        <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">self</span> <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+=</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">42</span>    }}<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">var</span> ext <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7.</span>simpleDescriptionprintln(ext)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: The number 7</span></code>



1.泛型的声明以及简单使用

<code class="hljs livecodeserver has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">func <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">repeat</span> <ItemType> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">item</span>:ItemType, times:Int) -> [ItemType] {    var <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">result</span> = [ItemType]()    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> i <span class="hljs-operator" style="box-sizing: border-box;">in</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.</span>.<times {        <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">result</span>.append(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">item</span>)    }    <span class="hljs-constant" style="box-sizing: border-box;">return</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">result</span>}let <span class="hljs-operator" style="box-sizing: border-box;">a</span> = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">repeat</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"knock"</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>)println(<span class="hljs-operator" style="box-sizing: border-box;">a</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: [knock, knock, knock, knock]</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li></ul>

PS: 所谓的泛型其实就是一个比较特殊的数组,它可以存储不同类型的数据, 这样子我们在写方法的时候, 就不需要再写多一个相同功能而类型不同的方法了.


2.枚举类型中的泛型

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">enum OptionalValue <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;"><</span>T<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">></span> {    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">None</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> Some(T)}<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">var</span> possibleInteger: OptionalValue <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;"><</span>Int<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">></span> <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span><span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">None</span>possibleInteger <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>Some(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">100</span>)</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

3.特定需求的泛型

<code class="hljs coffeescript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">func anyCommonElements <T, U where <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(0, 136, 0);">T</span>: SequenceType, <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(0, 136, 0);">U</span>: SequenceType, T.Generator.<span class="hljs-attribute" style="box-sizing: border-box; color: rgb(0, 136, 0);">Element</span>: Equatable, T.Generator.Element == U.Generator.Element> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(lhs: T, rhs: U)</span> -></span> Bool {    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> lhsItem <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> lhs {        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> rhsItem <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> rhs {            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> lhsItem == rhsItem {                <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">true</span>            }        }    }    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">false</span>}<span class="hljs-reserved" style="box-sizing: border-box;">var</span> any = anyCommonElements([<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>], [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9</span>])println(any)<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">//</span> 打印出来的结果: <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">false</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>

PS: 如果你需要某个指定样式的泛型, 那么就必须得在泛型里加上where这个关键字.

4.泛型的另一种写法

<code class="hljs r has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">func someFunction<<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">T</span>: SequenceType, U: SequenceType>(someT: <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">T</span>, someU: U) {//     <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">function</span> body goes here}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

PS: 在泛型中, 其实它有另外一种写法:< T: Equatable>, 它是和 < T where T: Equatable>这种写法等价的, 而例子中的SequenceType是系统定义好的, 所以在这里不能随便乱写.


在Swift中, 它本身提供了8, 16, 32 和64的有符号和无符号的整数类型, 和C语言中的命名很像, 但有一定的区别, 比如无符号的8位整数表示是UInt8, 有符号的32位整数表示是Int32, 而它里面有一定的属性, 比如:

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> a <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> UInt8<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">min</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> b <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> UInt8<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">max</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> c <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> Int8<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">min</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> d <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> Int8<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">max</span>println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"\(a), \(b), \(c), \(d)"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果:0, 255, -128, 127</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

它这里面的.min和.max的属性其实就是Swift的整数类型自带的. 但有注意点, 在32位系统中的Int和Int32长度是相同的, 而在64为系统中的Int和Int64长度是相同的, 而Uint也是如此, 比如UInt在32位系统中与UInt32相同, 而在64位系统中UInt与UInt64是相同的.

PS:除非你是有特殊长度的要求, 否则Int都是足够使用的了.


4.整数和浮点数的类型转换

在Swift里转换整数或者浮点数, 需要显式声明, 比如:

<code class="hljs livecodeserver has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">let <span class="hljs-constant" style="box-sizing: border-box;">three</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>let pointOneFourOneFiveNine = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.14159</span>let <span class="hljs-constant" style="box-sizing: border-box;">pi</span> = Double(<span class="hljs-constant" style="box-sizing: border-box;">three</span>) + pointOneFourOneFiveNineprintln(<span class="hljs-constant" style="box-sizing: border-box;">pi</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: 3.14159</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>

如果我们需要把结果再转换一下, 那就另外再显示声明:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> integerPi = Int(pi)println(integerPi)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: 3</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

这样子的写法就是把pi转换成整数, 转成整数的时候会自动把尾巴去掉, 无论你的小数最后一个是多大, 它不会根据什么四舍五入进行进制.


5.类型的别名

在Swift中也是有类型别名的, 下面让我们来看看:

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">typealias AudioSample <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> UInt16<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">var</span> maxAmplitudeFound <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> AudioSample<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">min</span>println(maxAmplitudeFound)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: 0</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>

他这个的定义和OC中的使用方法原理相似, 这里就不多解释.


在使用Bool的时候, 我们可以使用if来控制.在这里我们需要对if补充点东西, 在Swift使用if的时候, 我们需要声明条件, 否则编译器就会报错:

错误例子:

<code class="hljs coffeescript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-reserved" style="box-sizing: border-box;">let</span> a = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> a {}<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">//</span> 报错: Type <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Int'</span> does <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">not</span> conform to protocol <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'BooleanType'</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

正确的例子:

<code class="hljs livecodeserver has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">let <span class="hljs-operator" style="box-sizing: border-box;">a</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> <span class="hljs-operator" style="box-sizing: border-box;">a</span> == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>{}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li></li></ul>


2.元组

在Swift中, 有一个不同于OC中的数组, 但又有一些类似, 下面让我们来看看例子:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> http404Error = (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">404</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Not Found"</span>)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> (statusCode, statusMessage) = http404Errorprintln(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"The status code is \(statusCode)"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: The status code is 404</span>println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"The status message is \(statusMessage)"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: The status message is Not Found</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>

元组不同于数组的是, 它可以有多种类型, 也可以把多个值组合成一个复合值, 而数组是单一的类型, 不可以存储多种类型的东西.

还有一个更加强大的是, 你可以选择元组中的某个部分, 也可以去掉某个部分, 比如:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> (justTheStatusCode, _) = http404Errorprintln(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"The status code is \(justTheStatusCode)"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: The status code is 404</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

也可以利用元组中的某个元件来进行打印, 比如:

<code class="hljs scss has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-function" style="box-sizing: border-box;">println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"The status code is \(http404Error.0)"</span>)</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: The status code is 404</span><span class="hljs-function" style="box-sizing: border-box;">println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"The status message is \(http404Error.1)"</span>)</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: The status message is Not Found</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

也可以在声明元组的时候给元组里面的元件定义一些别名, 比如:

<code class="hljs go has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">let http200Status = (statusCode:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"> 200</span>, description: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"OK"</span>)<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"The status code is \(http200Status.statusCode)"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: The status code is 200</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"The status message is \(http200Status.description)"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: The status message is OK</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>

这个也是数组不所具备的特性, 虽然元组是比数组好用, 但在开发中, 我们也不能滥用元组, 适合才是王道.


3.可选

在Swift中, 有一个新的特性, 叫做optionals(可选), 举个例子, x声明时加上可选, 那么这个x就会有两种情况, 一种就是有值就等x 或者是没有值, 返回一个nil, 这与OC中的逻辑有一定的出入, 因为OC中它是要明确的声明该变量是否有没有值, 而且就算你要声明为nil, 你也要有明确的对象.

<code class="hljs cs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> possibleNumber = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"123"</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> convertedNumber = possibleNumber.toInt()println(convertedNumber)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: Optional(123)</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

在这个例子中, 我们给possjbleNumber初始化的时候声明了是String类型的, 但是在我们使用的时候, 加上toInt(), 一个是Srting类型, 一个是Int类型, 虽然类型不匹配, 但编译器不会直接报错, 但是它会有一个可选的提示, 可以选择把这个字符串转成Int类型.

那么我们怎样把这个可选变成肯定的值呢, 我们要在调用的时候加上一个 ‘!’ 号才可以, 比如:

<code class="hljs go has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (convertedNumber != <span class="hljs-constant" style="box-sizing: border-box;">nil</span>) {    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"\(possibleNumber) has an integer value of \(convertedNumber!)"</span>)} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"\(possibleNumber) could not be converted to an integer"</span>)}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 输出来的结果: 123 has an integer value of 123</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

PS: 在使用 ‘!’ 号的时候, 一定要清楚的知道该值是否是非nil, 否则的话就会出错.


4.可选绑定

可选绑定是用来判断可选是否包含值, 如果包含就把值赋给临时变量或者常量.

<code class="hljs go has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> let actualNumber = possibleNumber.toInt() {    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"\(possibleNumber) has an integer value of \(actualNumber)"</span>)} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"\(possibleNumber) could not be converted to an integer"</span>)}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: 123 has an integer value of 123</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

看例子, 我们知道是转型成功, 并且可以输出了正确的值, 这段代码的意思就是, 如果possjbleNumber.toInt转型成功, 那么我们就把值赋给常量actualNumber, 然后在输出成功转型的值, 否则就输出转型不成功的值.


5.nil

在Swift中的nil, 与OC中类似, 但又多了一些特征, 下面让我们来看看:

<code class="hljs delphi has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> serverResponseCode: Int? = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">404</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// serverResponseCode 包含了一个可选的Intz值 404</span>serverResponseCode = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">nil</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// serverResponseCode 现在不包含值</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

PS: nil不能用在非可选的常量或者变量当中, 如果在代码中有常量或者变量缺失


6.隐式解析可选

在我们Swfit中, 如果确定一个变量总会有值的话, 我们就不能经常用 ‘?’ 号, 因为这样子就会增加运算, 效率会非常的低, 在这里我们要使用一个隐式可选.

常规的可选:

<code class="hljs javascript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> possibleString: <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">String</span>? = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"An optional string."</span>println(possibleString!)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: An optional string.</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

由于possibleString在初始化之后就总会有值, 所以我们在这里进行一些修改:

<code class="hljs javascript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> assumedString: <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">String</span>! = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"An implicitly unwrapped optional string."</span>println(assumedString) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 在这里是不需要再加 '!'</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: An implicitly unwrapped optional string.</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

只要在声明的时候加上一个 ‘!’ 号, 那么就说明你定义的常量就必须得要有值, 不需要在内部再使用 if 进行判断, 这个可以提高我们的执行效率. 
PS: 如果你在隐式解析可选没有值的时候尝试取值, 会触发运行时的错误.

但是在新更新的Swift中, 使用隐式可选的常量或者变量, 再使用时, 得加上那么一句代码:

<code class="hljs go has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (assumedString != <span class="hljs-constant" style="box-sizing: border-box;">nil</span>) {    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(assumedString)}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: An implicitly unwrapped optional string.    </span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

在这里, 可以括号括起来, 也可以不用括号, 都是可以的:

<code class="hljs go has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> assumedString != <span class="hljs-constant" style="box-sizing: border-box;">nil</span> {    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(assumedString)}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: An implicitly unwrapped optional string.</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

同样, 也是可以这么使用:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> definiteString = assumedString {    println(definiteString)}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: An implicitly unwrapped optional string.</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>

7.断言

在我们程序开发的时候, 我们有一项非常重要的工作, 那就是调试, 在Swift的可选中, 可以判断该值是否存在, 如果该值存在, 那么程序就会正常运行, 但如果该值不存在, 那么程序就会中止, 这里面有一个全局的函数叫做assertion, 我们可以通过传入一个值, 然后去判断该值是否满足条件, 如果是turn那就正常运行, 如果是false, 那就中止, 比如:

<code class="hljs erlang has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> age = -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span><span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-title" style="box-sizing: border-box;">assert</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(age >= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"A person's age cannot be less than zero"</span>)</span></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

断言 
这样子就会触发断言, 因为不符合我们所要求的, 所以就会中止程序.

并且断言有一个要求, 在断言里面是不能插入字符串信息的, 所以我们这里需要改进一下:

<code class="hljs fix has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-attribute" style="box-sizing: border-box;">assert(age ></span>=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;"> 0)</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

使用断言的场景: 
1.整数的附属脚本索引被传入一个自定义附属脚本实现,但是下标索引值可能太小或者太大。

2.需要给函数传入一个值,但是非法的值可能导致函数不能正常执行。

3.一个可选值现在是 nil,但是后面的代码运行需要一个非 nil 值。

PS: 断言的出现是会让程序中止的, 所以在这里我们需要仔细设计代码来让非法条件不会出现.


Swfit还提供对浮点数类型进行取余预算 “%”, 还提供了C没有提供的区间, “0..<20” 或者 “0…20”.

3.区间运算符

所谓的区间运算其实就是我们设定的范围, 在我们 for-in 的时候就会用到, 或者其他有关于从几到几的运算都是要用到区间运算符的, 在Swift中的区间运算符很简单:

区间运算符

<code class="hljs axapta has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">index</span> in <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.10</span> {        println(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">index</span>)}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

还有一种叫做半区间运算符

<code class="hljs axapta has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">index</span> in <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.</span>.<<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span> {        println(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">index</span>)}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

看到结果就知道是什么情况了, 这里我就不多做说明了.



2.初始化空字符串

<code class="hljs javascript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> emptyString = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">""</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> anotherEmptyString = <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">String</span>()</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

这两者都是空字符串的初始化方式, 两者都是等价的.

我们还可以通过一个函数来判断字符串是否为空:

<code class="hljs go has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> emptyString.isEmpty {    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Nothing to see here"</span>)}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: Nothing to see here</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

3.字符串可变性

在Swift中更改字符串和添加字符串是非常简单的事情, 比如:

<code class="hljs go has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> variableString = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Horse"</span>variableString += <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" and carriage"</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(variableString)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: Horse and carriage</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

有一个注意点, 常量的时候是不可以这样子做的, 编译器会报错, 比如:

<code class="hljs bash has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">let</span> constantString = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Highlander"</span>constantString += <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" and another Highlander"</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

常量不可这样用


4.字符串是值类型

Swift 的 String 类型是值类型。如果您创建了一个新的字符串值,那么当其进行常量、变量 赋值操作或在函数/方法中传递时,会进行值拷贝。在不同情况下,都会对已有字符串值创 
建新副本,并对该新副本进行传递或赋值。

PS: 和 Cocoa 中的 NSString 不同,当您在 Cocoa 中创建了一个 NSString 实例 并将其传递给一个函数/方法,或者赋给一个变量,您永远都是传递或赋值同一个 NSString 实例的一个引用。除非您特别要求其进行值拷贝,否则字符串不会进行赋值 新副本操作。

Swift 默认字符串拷贝的方式保证了在函数/方法中传递的是字符串的值,其明确您独有该字 符串的值,无论它来自哪里。您可以放心您传递的字符串本身不会被更改,除非是你自己更 改它。



2.计算字符数量

在字符和字符串中, 有一个函数是可以打印字符的数量, 比如:

<code class="hljs go has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> variableString = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Horse"</span>variableString += <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" and carriage"</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"\(countElements(variableString))"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: 18</span>let unusualMenagerie = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Koala ��, Snail ��, Penguin ��, Dromedary ��"</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"unusualMenagerie has \(countElements(unusualMenagerie)) characters"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: unusualMenagerie has 40 characters</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>

打印字符

PS: 
1.不同的 Unicode 字符以及相同 Unicode 字符的不同表示方式可能需要不同数量的 内存空间来存储,所以 Swift 中的字符在一个字符串中表示并不一定占用相同的内存空 间。因此,字符串的长度不得不通过迭代字符串中每一个字符的长度来进行计算。如果 您正在处理一个长字符串,需要注意 countElements 函数必须遍历字符串中的字符,以 精准计算字符串的长度。

2.另外需要注意的是通过 countElements 返回的字符数量并不总是与包含相同字符的 NSString 的 length 属性相同。NSString 的 length 属性是基于利用 UTF-16 表示的十 六位 code units 数目,而不是基于 Unicode 字符。为了解决这个问题,NSString 的 length 属性在被 Swift 的 String 值访问时会被称为 utf16count。


3.连接字符串和字符

和前面一样, 字符和字符串也可以加在一起的, 但这里要做一些特殊的处理, 比如:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> string1 = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Hello"</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> string2 = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" World"</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> character1: Character = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"!"</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> character2: Character = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"?"</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> welcome = string1 + string2welcome.append(character1)println(welcome)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: Hello World!</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul>

也可以使用加法赋值运算:

<code class="hljs go has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> characterPlusCharacter = string1characterPlusCharacter += string2<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(characterPlusCharacter)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: Hello World</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

4.字符串插值:

字符串插值是一种全新的构建字符串的方式,可以在其中包含常量、变量、字面量和表达式, 比如:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> multiplier = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> message = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"</span>println(message)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: 3 times 2.5 is 7.5</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

PS: 插值字符串中写在括号中的表达式不能包含非转义双引号 ( “” ) 和反斜杠 ( \ ) 并且不能包含回车或换行符。


5.比较字符串

Swift 供了三种方式来比较字符串的值:字符串相等,前缀相等和后缀相等。

字符串相等:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> quotation = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"We're a lot alike, you and I."</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> sameQuotation = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"We're a lot alike, you and I."</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> quotation == sameQuotation {    println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"These two strings are considered equal"</span>)}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: These two strings are considered equal</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

前后缀相等:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> romeoAndJuliet = [    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Act 1 Scene 1: Verona, A public place"</span>,    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Act 1 Scene 2: Capulet's mansion"</span>,    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Act 1 Scene 3: A room in Capulet's mansion"</span>,    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Act 1 Scene 4: A street outside Capulet's mansion"</span>,    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Act 1 Scene 5: The Great Hall in Capulet's mansion"</span>,    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Act 2 Scene 1: Outside Capulet's mansion"</span>,    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Act 2 Scene 2: Capulet's orchard"</span>,    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Act 2 Scene 3: Outside Friar Lawrence's cell"</span>,    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Act 2 Scene 4: A street in Verona"</span>,    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Act 2 Scene 5: Capulet's mansion"</span>,    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Act 2 Scene 6: Friar Lawrence's cell"</span>]<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> act1SceneCount = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> scene <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> romeoAndJuliet {    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> scene.hasPrefix(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Act 1 "</span>) {        ++act1SceneCount    }}println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"There are \(act1SceneCount) scenes in Act 1"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: There are 5 scenes in Act 1</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li></ul>
<code class="hljs cs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> mansionCount = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> cellCount = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> scene <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> romeoAndJuliet {    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> scene.hasSuffix(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Capulet's mansion"</span>){        ++mansionCount    } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> scene.hasSuffix(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Friar Lawrence's cell"</span>){        ++cellCount    }}println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"\(mansionCount) mansion scenes; \(cellCount) cell scenes"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: 6 mansion scenes; 2 cell scenes</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li></ul>

6.大小写字符串

在Swift当中也有一个函数, 可以直接把字符串变成全部大写字母, 或者全部小写字母:

<code class="hljs bash has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">let</span> normal = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Could you help me, please?"</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">let</span> shouty = normal.uppercaseString<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">let</span> whispered = normal.lowercaseStringprintln(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"\(shouty), \(whispered)"</span>)// 打印出来的结果:COULD YOU HELP ME, PLEASE?, could you <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">help</span> me, please?</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>



1.数组构造语句

<code class="hljs vbscript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> i: [<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">Int</span>] = [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span> , <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>]</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

这个数组类型是Int类型的, 所以只能存储 Int 类型的参数, 和元组不一样, 元组是可以存储不同类型的数据.

PS: 这里使用的例子是用 let 声明的, 所以后续是不可以再添加元素, 如果是以 var 开头的话, 是可以后续再添加的.


2.访问和修改数组

我们可以通过数组的方法和属性来访问和修改数组,或者下标语法。 还可以使用数组的只读属性 count 来获取数组中的数据项数量。

<code class="hljs scss has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-function" style="box-sizing: border-box;">println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"The shopping list contains \(str3.count) items."</span>)</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: The shopping list contains 6 items.</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

使用布尔项 isEmpty 来作为检查 count 属性的值是否为 0 的捷径。

<code class="hljs javascript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> str: [<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">String</span>] = [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"a"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"b"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"c"</span>]<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> str2: [<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">String</span>] = [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"d"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"e"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"f"</span>]<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> str3 = str + str2<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> str3.isEmpty {    println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"The shopping list is empty."</span>)} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {    println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"The shopping list is not empty."</span>)}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: The shopping list is not empty.</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul>

由于 str3 非空, 所以打印出来的结果是The shopping list is empty

如果要给数组添加元素的话, 可以通过下面的方法:

<code class="hljs go has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">str3.<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">append</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"g"</span>)<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(str3)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// [a, b, c, d, e, f, g]</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

也可以通过加法赋值运算来对数组进行修改:

<code class="hljs go has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">str3 += [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"h"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"i"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"j"</span>]<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(str3)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: [a, b, c, d, e, f, g, h, i, j]</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

如果要取出数组里面的某个元素, 我们得以下面的方法来做:

<code class="hljs go has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> str4 = str3<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">[0</span>]<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(str4)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: a</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

在这里, 数组的元素起始位置和OC是一样的, 都是从 0 开始.

我们也可以通过取出数组的元素位置来进行修改, 比如:

<code class="hljs go has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">str3<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">[0</span>] = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Hello"</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(str3)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: [Hello, b, c, d, e, f, g, h, i, j]</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

我们也可以利用区间来对数组元素进行修改:

<code class="hljs go has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">str3<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">[1</span>..<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.4</span>] = [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Hello"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"World"</span>]<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(str3)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: [Hello, Hello, World, h, i, j]</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

PS: 我们不能使用下标语法在数组尾部添加新项。如果我们试着用这种方法对索引越界的数据进行检索或者设置新值的操作,我们会引发一个运行期错误。我们可以使用索引值和 数组的 count 属性进行比较来在使用某个索引之前先检验是否有效。除了当 count 等于 0 时(说明这是个空数组),最大索引值一直是 count - 1,因为数组都是零起索引。

我们也可以把内容添加到指定的索引值里, 比如:

<code class="hljs go has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">str3.insert(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Cain"</span>, atIndex:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"> 0</span>)<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(str3)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: [Cain, Hello, Hello, World, f, g, h, i, j]</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

有添加, 当然也会有删除的, 下面让我们来看看删除的方法:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> str5 = str3.removeAtIndex(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>)println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"\(str5), \(str3)"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: Cain, [Hello, Hello, World, f, g, h, i, j]</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

经过删除之后, 我们数组里的第一个元素就会变回我们之前设置的那样, 比如:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> firstItem = str3[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]println(firstItem)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: Hello</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

3.数组的遍历

数组的遍历非常的简单, 这里就不多说了, 直接看例子:

<code class="hljs rust has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">str</span>: [String] = [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"a"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"b"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"c"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"d"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"e"</span>]<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> i in <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">str</span> {    println(i)}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: a, b, c, d, e</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

如果有详细数据的要求, 我们可以这么做:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (index, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> enumerate(str) {    println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Item\(index + 1), \(value)"</span>)}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//打印出来的结果: Item1, a, Item2, b, Item3, c, Item4, d, Item5, e</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

4.创建并且构造一个数组

现在我们来详细来构造一下数组:

<code class="hljs vhdl has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">var someInts = [Int]()println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"someInts is of type Int[] with \(someInts.count) items。"</span>)// 打印出来的结果: someInts <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">is</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">of</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">type</span> Int[] <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">with</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> items。</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

上面创建出来的数组是一个空的数组, 现在让我们来看看后续怎么对这个数组进行操作:

<code class="hljs go has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">someInts.<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">append</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">(3</span>)<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(someInts)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: [3]</span>someInts = []<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(someInts)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: []</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

解释一下, 在somInts后面加了 .append(3), 那么数组里就有一个元素, 后面someInts = [], 的意思就是把数组清空, 所以打印出来的结果就是空的.

我们还有另一种创建的方法, 比如:

<code class="hljs markdown has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">var threeDoubles = [<span class="hljs-link_label" style="box-sizing: border-box;">Double</span>](<span class="hljs-link_url" style="box-sizing: border-box;">count: 3, repeatedValue:0.0</span>)println(threeDoubles)// 打印出来的结果: [0.0, 0.0, 0.0]</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

PS: 这种创建方式比较的单一, 只能创建多个相同的元素.

但是我们可以这么做:

<code class="hljs javascript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> anotherThreeDoubles = <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">Array</span>(count: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>, repeatedValue: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.5</span>)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> sixDoubles = threeDoubles + anotherThreeDoublesprintln(sixDoubles)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>

5.字典

在Swift中也有字典, 字典的存储方式也是以键值对方式存储的, 而且都是一对一的关系, 不会一个键对应多个值, 或者一个值对应多个键, 和数组一样, 字典在存储之前也必须得先声明确定的键值对, 比如:

<code class="hljs javascript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> airports: Dictionary<<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">String</span>, <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">String</span>> = [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"TYO"</span>: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Tokyo"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"DUB"</span>: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Dublin"</span>]println(airports)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: [DUB: Dublin, TYO: Tokyo]</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

6.读取和修改字典

和数组一样, 我们同样是可以对字典进行修改的, 比如:

<code class="hljs go has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">airports[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"LHR"</span>] = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"London"</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(airports)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: [DUB: Dublin, TYO: Tokyo, LHR: London]</span>airports[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"LHR"</span>] = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"London Heathrow"</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(airports)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: [DUB: Dublin, TYO: Tokyo, LHR: London Heathrow]</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

或者是利用下标语法进行修改:

<code class="hljs bash has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">let</span> oldValue = airports.updateValue(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Dublin Internation"</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>Key: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"DUB"</span>) {    println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"The old value for DUB was \(oldValue)."</span>)}// 打印出来的结果: The old value <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> DUB was Dublin.</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

我们也可以使用下标语法来搜索字典里特定的键值对:

<code class="hljs coffeescript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> <span class="hljs-reserved" style="box-sizing: border-box;">let</span> airportName = airports[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"DUB"</span>] {    println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"The name of the airport is \(airportName)."</span>)} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {    println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"That airport is not in the airports dictionary."</span>)}<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">//</span> 打印出来的结果: The name <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">of</span> the airport <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">is</span> Dublin Internation.</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

删除字典里的某个键值对:

<code class="hljs go has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">airports[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"APL"</span>] = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Apple Internation"</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(airports)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: [DUB: Dublin, TYO: Tokyo, APL: Apple Internation]</span>airports[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"APL"</span>] = <span class="hljs-constant" style="box-sizing: border-box;">nil</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(airports)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: [DUB: Dublin, TYO: Tokyo]</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

我们还可以利用下标语法对字典里特定的键值对进行删除:

<code class="hljs go has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> let removedValue = airports.removeValueForKey(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"DUB"</span>) {    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"The removed airport's name is \(removedValue)."</span>)} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"The airports dictionary does not contain a value for DUB."</span>)}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: The removed airport's name is Dublin.</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

7.遍历字典

在Swift里遍历字典是一件非常爽的事情, 和OC完全不一样, 快速简单多了, 让我们来看看:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (airportCode, airportName) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> airports {    println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"\(airportCode): \(airportName)"</span>)}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: DUB: Dublin, TYO: Tokyo</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

没错, 你没看错, 在Swift中遍历字典就这两行代码, 非常的快速简单, 爽爆了.

同样的, 我们也可以只遍历键, 或者是值:

<code class="hljs livecodeserver has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> airportCode <span class="hljs-operator" style="box-sizing: border-box;">in</span> airports.<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">keys</span> {    println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Airport code: \(airportCode)"</span>)}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: Airport code: DUB, Airport code: TYO</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> airportName <span class="hljs-operator" style="box-sizing: border-box;">in</span> airports.values {    println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Airport name: \(airportName)"</span>)}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: Airport name: Dublin, Airport name: Tokyo</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>

同样是非常的爽, 这里就让各位回去自己试试看, 对比一下OC和Swift的区别了.

在这里, 我们可以通过键或者值创建出一个新的数组, 比如:

<code class="hljs javascript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> airportCodes = <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">Array</span>(airports.keys)println(airportCodes)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: [DUB, TYO]</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> airportNames = <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">Array</span>(airports.values)println(airportNames)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果:[Dublin, Tokyo]</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>

8.创建空的字典

和数组一样, 我们也可以创建一个空的字典, 比如:

<code class="hljs javascript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> namesOfIntegers = Dictionary<Int, <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">String</span>>()println(namesOfIntegers)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: [:]</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

我们可以后续给它添加键值对, 比如:

<code class="hljs go has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">namesOfIntegers<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">[1</span>] = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"a"</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(namesOfIntegers)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: [1 : a]</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

同样的, 我们也可以给字典清零:

<code class="hljs go has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">namesOfIntegers = [:]<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(namesOfIntegers)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: [:]</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

9.集合的可变性

数组和字典都是在单个集合中存储可变值。如果我们创建一个数组或者字典并且把它分配成一个变量,这个集合将会是可变的。这意味着我们可以在创建之后添加更多或移除已存在的 数据项来改变这个集合的大小。与此相反,如果我们把数组或字典分配成常量,那么他就是 不可变的,它的大小不能被改变。

对字典来说,不可变性也意味着我们不能替换其中任何现有键所对应的值。不可变字典的内 容在被首次设定之后不能更改。 不可变行对数组来说有一点不同,当然我们不能试着改变 任何不可变数组的大小,但是我们可以重新设定相对现存索引所对应的值。这使得 Swift 数组在大小被固定的时候依然可以做的很棒。

PS: 在我们不需要改变数组大小的时候创建不可变数组是很好的习惯。如此 Swift 编译 器可以优化我们创建的集合。


7.范围匹配

<code class="hljs javascript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> count = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>_000_000_000_000<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> countedThings = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"stars in the Milky Way"</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> naturalCount: <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">String</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">switch</span> count {    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>:        naturalCount = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"no"</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.3</span>:        naturalCount = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"a few"</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4.</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.9</span>:        naturalCount = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"several"</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10.</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.99</span>:        naturalCount = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"tens of"</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">100.</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.999</span>:        naturalCount = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"hundreds of"</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1000.</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.999</span>_999:        naturalCount = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"thousands of"</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">default</span>:        naturalCount = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"millions and millions of"</span>    }println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"There are \(naturalCount) \(countedThings)."</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果:There are millions and millions of stars in the Milky Way.</span></code>




1.元组

你可以使用元组在同一个 switch 语句中测试多个值。元组中的元素可以是值,也可以是范围。另外,使用下划线( _ )来匹配所有可能的值。

<code class="hljs go has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">let somePoint = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">(1</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"> 1</span>)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">switch</span> somePoint {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">(0</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"> 0</span>):    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"(0, 0)is at the origin"</span>)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> (_,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"> 0</span>):    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"(\(somePoint.0), 0) is on the x-axis"</span>)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">(0</span>, _):    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"0, \(somePoint.1) is on the y-axis"</span>)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">(-2</span>..<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.2</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"> -2</span>..<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.2</span>):    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"(\(somePoint.0), \(somePoint.1)) is inside the box"</span>)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">default</span>:    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"(\(somePoint.0), \(somePoint.1)) is outside of the box"</span>)}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//打印出来的结果: (1, 1) is inside the box</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>

2.绑定值

case 块的模式允许将匹配的值绑定到一个临时的常量或变量,这些常量或变量在该 case 块 里就可以被引用了——这种行为被称为值绑定。

<code class="hljs coffeescript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-reserved" style="box-sizing: border-box;">let</span> anotherPoint = (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">switch</span> anotherPoint {<span class="hljs-reserved" style="box-sizing: border-box;">case</span> (<span class="hljs-reserved" style="box-sizing: border-box;">let</span> x, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>):    println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"on the x-axis with an x value of \(x)"</span>)<span class="hljs-reserved" style="box-sizing: border-box;">case</span> (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, <span class="hljs-reserved" style="box-sizing: border-box;">let</span> y):    println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"on the y-axis with a y value of \(y)"</span>)<span class="hljs-reserved" style="box-sizing: border-box;">case</span> <span class="hljs-reserved" style="box-sizing: border-box;">let</span> (x, y):    println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"somewhere else at (\(x), \(y))"</span>)}<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">//</span> 打印出来的结果: <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">on</span> the x-axis <span class="hljs-reserved" style="box-sizing: border-box;">with</span> an x value <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">of</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li></ul>

3.Where

case 块的模式可以使用 where 语句来判断额外的条件。当且仅当 where 语句的条件为真时,匹配到的 case 块才会被执行。

<code class="hljs cs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> yetAnotherPoint = (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">switch</span> yetAnotherPoint {    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> (x, y) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">where</span> x == y:        println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"(\(x), \(y)) is on the line x == y"</span>)    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> (x, y) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">where</span> x == -y:        println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"(\(x), \(y)) is on the line x == -y"</span>)    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">let</span> (x, y):        println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"(\(x), \(y)) is just some arbitrary point"</span>)}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果: (1, -1) is on the line x == -y</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul>


3.Fallthrough

Swift 语言中的 switch 不会从上一个 case 分支落入到下一个 case 分支中。相反,只要第一个匹配到的 case 分支完成了它需要执行的语句,整个 switch 代码块完成了它的执行。相比 之下,C 语言要求你显示的插入 break 语句到每个 switch 分支的末尾来阻止自动落入到下 一个case分支中。Swift语言的这种避免默认落入到下一个分支中的特性意味着它的switch功能要比 C 语言的更加清晰和可预测,可以避免无意识地执行多个 case 分支从而引发的错 误。

<code class="hljs go has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">let integerToDescribe =<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"> 5</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> description = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"The number \(integerToDescribe) is"</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">switch</span> integerToDescribe {    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"> 2</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">,3</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">,5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">,7</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">,11</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">,13</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">,17</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">,19</span>:    description += <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" a prime number, and also"</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">fallthrough</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">default</span>:    description += <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" an integer."</span>}<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(description)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果:The integer value of 三 is 3.</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li></ul>

PS: fallthrough 关键字不会检查它下一个将会落入执行的 case 中的匹配条件。fallthrough 简单地使代码执行继续连接到下一个 case 中的执行代码,这和 C 语言标准中的 switch 语句特性是一样的。


4.Labeled Statements

在 Swift 语言中,你可以在循环体和 switch 代码块中嵌套循环体和 switch 代码块来创造复杂的控制流结构。然而,循环体和 switch 代码块两者都可以使用 break 语句来提前结束整 个方法体。因此,显示地指明 break 语句想要终止的是哪个循环体或者 switch 代码块,会很 有用。类似地,如果你有许多嵌套的循环体,显示指明 continue 语句想要影响哪一个循环体也会非常有用。

我们直接来看例子:

<code class="hljs go has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> a =<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"> 10</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> b =<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;"> 0</span>varB: while b != a {    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(b++)}<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">println</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"循环结束, b = \(b)"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 打印出来的结果:</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 0</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 1</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 2</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 3</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 4</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 5</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 6</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 7</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 8</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 9</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 循环结束, b = 10</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li></ul>

其实这个Labeled Statements很简单, 就相当于给一个循环体加了一个名字, 而例子中的循环体名字就叫做varB.



5.多返回值函数 

在Swift中, 我们可以声明多个类型的返回值, 元组就是一个最好的例子了, 比如:

<code class="hljs coffeescript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">func count<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(string: String)</span> -></span> (<span class="hljs-attribute" style="box-sizing: border-box; color: rgb(0, 136, 0);">vowels</span>: Int, <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(0, 136, 0);">consonants</span>: Int, <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(0, 136, 0);">others</span>: Int) {    <span class="hljs-reserved" style="box-sizing: border-box;">var</span> vowels = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, consonants = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, others = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> character <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> string {    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">switch</span> String(character).lowercaseString {        <span class="hljs-reserved" style="box-sizing: border-box;">case</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"a"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"e"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"i"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"o"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"u"</span>:            ++vowels        <span class="hljs-reserved" style="box-sizing: border-box;">case</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"b"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"c"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"d"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"f"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"g"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"h"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"j"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"k"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"l"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"m"</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"n"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"p"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"q"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"r"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"s"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"t"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"v"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"w"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"x"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"y"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"z"</span>:            ++consonants        <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(0, 136, 0);">default</span>:            ++others        }    }    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> (vowels, consonants, others)}<span class="hljs-reserved" style="box-sizing: border-box;">let</span> total = count(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"some arbitrary string!"</span>)println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"\(total.vowels) vowels and \(total.consonants) consonants, others is \(total.others)."</span>)<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">//</span> 打印出来的结果: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span> vowels <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">and</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">13</span> consonants, others <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">is</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3.</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li></li></ul>



0 0
原创粉丝点击