iOS开发系列--Swift语言
<h1>概述</h1><p>Swift是苹果2014年推出的全新的编程语言,它继承了C语言、ObjC的特性,且克服了C语言的兼容性问题。Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在其中你可以看到C#、Java、Javascript、Python等多种语言的影子。同时在2015年的WWDC上苹果还宣布Swift的新版本Swift2.0,并宣布稍后Swift即将开源,除了支持iOS、OS X之外还将支持linux。</p>
<p>本文将继续iOS开发系列教程,假设读者已经有了其他语言基础(强烈建议初学者从本系列第一章开始阅读,如果您希望从Swift学起,那么推荐你首先阅读苹果官方电子书《the swift programming language》),不会从零基础一点点剖析这门语言的语法,旨在帮助大家快速从ObjC快速过度到Swift开发中。即便如此,要尽可能全面的介绍Swift的语法特点也不是一件容易的事情,因此本文将采用较长的篇幅进行介绍。</p>
<ol class="kc-catalog">
<li>基础部分<ol>
<li>第一个Swift程序</li>
<li>数据类型<ol>
<li>基础类型</li>
<li>集合类型</li>
<li>元组</li>
<li>可选类型</li>
</ol></li>
<li>运算符</li>
<li>控制流</li>
</ol></li>
<li>函数和闭包<ol>
<li>函数</li>
<li>闭包</li>
</ol></li>
<li>类<ol>
<li>属性</li>
<li>方法</li>
<li>下标脚本</li>
<li>继承</li>
</ol></li>
<li>协议</li>
<li>扩展</li>
<li>枚举和结构体<ol>
<li>结构体</li>
<li>枚举</li>
</ol></li>
<li>泛型</li>
</ol>
<h1 id="basic">基础部分</h1>
<h2 id="firstSwift">第一个Swift程序</h2>
<p>创建一个命令行程序如下:</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_790449" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift keyword">import</code> <code class="swift variable">Foundation</code></div>
<div class="line number2 index1 alt1"> </div>
<div class="line number3 index2 alt2"><code class="swift comments">/**</code></div>
<div class="line number4 index3 alt1"><code class="swift comments">* Swift没有main函数,默认从top level code的上方开始自上而下执行(因此不能有多个top level代码)</code></div>
<div class="line number5 index4 alt2"><code class="swift comments">*/</code></div>
<div class="line number6 index5 alt1"><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"Hello, World!"</code><code class="swift plain">)</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>从上面的代码可以看出:</p>
<ol>
<li>Swift没有main函数,从top level code的上方开始往下执行(就是第一个非声明语句开始执行[表达式或者控制结构,类、结构体、枚举和方法等属于声明语句]),不能存在多个top level code文件(否则编译器无法确定执行入口,事实上swift隐含一个main函数,这个main函数会设置并调用全局 “C_ARGC C_ARGV”并调用由top level code构成的top_level_code()函数);</li>
<li>Swift通过import引入其他类库(和Java比较像);</li>
<li>Swift语句不需要双引号结尾(尽管加上也不报错),除非一行包含多条语句(和Python有点类似);</li>
</ol>
<h2 id="dataType">数据类型</h2>
<p>Swift包含了C和ObjC语言中的所有基础类型,Int整形,Float和Double浮点型,Bool布尔型,Character字符型,String字符串类型;当然还包括enum枚举、struct结构体构造类型;Array数组、Set集合、Dictionary字典集合类型;不仅如此还增加了高阶数据类型元组(Tuple),可选类型(Optinal)。</p>
<h3 id="basicType">基础类型</h3>
<p>Xcode 从6.0开始加入了Playground代码测试,可以实时查看代码执行结果,下面使用Playground简单演示一下Swift的基础内容,对Swift有个简单的认识:</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_557224" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
<div class="line number38 index37 alt1">38</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift keyword">import</code> <code class="swift variable">Foundation</code></div>
<div class="line number2 index1 alt1"> </div>
<div class="line number3 index2 alt2"><code class="swift keyword">var</code> <code class="swift variable">a</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">=</code><code class="swift value">1</code> <code class="swift comments">//通过var定义一个变量</code></div>
<div class="line number4 index3 alt1"> </div>
<div class="line number5 index4 alt2"><code class="swift comments">//下面变量b虽然没有声明类型,但是会自动进行类型推断,这里b推断为Int类型</code></div>
<div class="line number6 index5 alt1"><code class="swift keyword">var</code> <code class="swift variable">b</code><code class="swift plain">=</code><code class="swift value">2</code></div>
<div class="line number7 index6 alt2"> </div>
<div class="line number8 index7 alt1"><code class="swift keyword">var</code> <code class="swift color2">c</code><code class="swift plain">:</code><code class="swift color2">UInt</code><code class="swift plain">=</code><code class="swift value">3</code></div>
<div class="line number9 index8 alt2"><code class="swift keyword">let</code> <code class="swift variable">d</code><code class="swift plain">=</code><code class="swift variable">a</code><code class="swift plain">+</code><code class="swift variable">b</code> <code class="swift comments">//通过let定义一个变量</code></div>
<div class="line number10 index9 alt1"> </div>
<div class="line number11 index10 alt2"><code class="swift comments">//下面通过"\()"实现了字符串和变量相加(字符串插值),等价于println("d="+String(d))</code></div>
<div class="line number12 index11 alt1"><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"d=\(</code><code class="swift variable">d</code><code class="swift string">)"</code><code class="swift plain">) </code><code class="swift comments">//结果:d=3</code></div>
<div class="line number13 index12 alt2"> </div>
<div class="line number14 index13 alt1"><code class="swift comments">//注意由于Swift是强类型语言,a是Int类型而c是UInt类型,二者不能运算,下面的语句报错;但是注意如果是类似于:let a=1+2.0是不会报错的,因为两个都是字面量,Swift会首先计算出结果再推断a的类型</code></div>
<div class="line number15 index14 alt2"><code class="swift comments">//let e=a+c</code></div>
<div class="line number16 index15 alt1"> </div>
<div class="line number17 index16 alt2"><code class="swift comments">//Int.max是Int类型的最大值,类似还有Int.min、Int32.max、Int32.min等</code></div>
<div class="line number18 index17 alt1"><code class="swift keyword">let</code> <code class="swift variable">e</code><code class="swift plain">=</code><code class="swift color2">Int</code><code class="swift plain">.</code><code class="swift color2">max</code> <code class="swift comments">//结果:9223372036854775807</code></div>
<div class="line number19 index18 alt2"> </div>
<div class="line number20 index19 alt1"><code class="swift keyword">var</code> <code class="swift variable">f</code><code class="swift plain">:</code><code class="swift color2">Float</code><code class="swift plain">=</code><code class="swift value">1.0</code></div>
<div class="line number21 index20 alt2"><code class="swift keyword">var</code> <code class="swift variable">g</code><code class="swift plain">=</code><code class="swift value">2.0</code> <code class="swift comments">//浮点型自动推断为Double类型</code></div>
<div class="line number22 index21 alt1"> </div>
<div class="line number23 index22 alt2"><code class="swift keyword">var</code> <code class="swift variable">h</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">=</code><code class="swift string">"hello "</code></div>
<div class="line number24 index23 alt1"> </div>
<div class="line number25 index24 alt2"><code class="swift comments">//emoj表情也可以作为变量或者常量,事实上所有Unicode字符都是可以的</code></div>
<div class="line number26 index25 alt1"><code class="swift keyword">var</code> <code class="swift plain">💖🍎=</code><code class="swift string">"love and apple"</code></div>
<div class="line number27 index26 alt2"> </div>
<div class="line number28 index27 alt1"><code class="swift comments">//两个字符串相加,但是注意不同类型不能相加</code></div>
<div class="line number29 index28 alt2"><code class="swift keyword">var</code> <code class="swift variable">i</code><code class="swift plain">=</code><code class="swift variable">h</code><code class="swift plain">+💖🍎 </code><code class="swift comments">//结果:hello love and apple</code></div>
<div class="line number30 index29 alt1"> </div>
<div class="line number31 index30 alt2"><code class="swift comments">//布尔类型只有两个值true、false,类似于if语句中的条件只能是布尔类型不能像ObjC一样非0即真</code></div>
<div class="line number32 index31 alt1"><code class="swift keyword">var</code> <code class="swift variable">j</code><code class="swift plain">:</code><code class="swift color2">Bool</code><code class="swift plain">=</code><code class="swift color2">true</code></div>
<div class="line number33 index32 alt2"> </div>
<div class="line number34 index33 alt1"><code class="swift comments">//字符类型,同样使用双引号,但是只能是一个字符,如果不指定类型则"c"默认会推断为字符串(var k:Character="c"是字符类型,但是var k="c"是字符串类型)</code></div>
<div class="line number35 index34 alt2"><code class="swift keyword">var</code> <code class="swift variable">k</code><code class="swift plain">:</code><code class="swift color2">Character</code><code class="swift plain">=</code><code class="swift string">"c"</code></div>
<div class="line number36 index35 alt1"> </div>
<div class="line number37 index36 alt2"><code class="swift keyword">var</code> <code class="swift variable">l</code><code class="swift plain">=</code><code class="swift value">00100</code> <code class="swift comments">//等于100,可以在前面添加额外的0</code></div>
<div class="line number38 index37 alt1"><code class="swift keyword">var</code> <code class="swift variable">m</code><code class="swift plain">=</code><code class="swift value">10_000_000</code> <code class="swift comments">//等于10000000,可以使用增加额外的下划线方便阅读而不改变值的大小</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<ol>
<li>Swift通过var进行变量定义,通过let进行常量定义(这和其他高级语言比较类似,例如F#);</li>
<li>Swift添加了类型推断,对于赋值的常量或者变量会自动推断其具体类型;</li>
<li>Swift是强类型语言(应该说它比C#、Java等强类型语言控制还要严格),不同的数据类型之间不能隐式转化,如果需要转化只能强制转化;</li>
<li>在Swift中类型转换直接通过其类型构造函数即可,降低了API的学习成本;</li>
</ol>
<h3 id="collectionType">集合类型</h3>
<p>Swift提供了三种集合类型:数组Array、集合Set、字典Dictionary。和ObjC不同的是,由于Swift的强类型,集合中的元素必须是同一类型,而不能像ObjC一样可以存储任何对象类型,并且注意Swift中的集合是值类型而非引用类型(事实上包括String、结构体struct、枚举enum都是值类型)。</p>
<p>首先看一下Swift中的数组:</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_874173" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift comments">//声明数组的时候必须确定其类型,下面使用声明一个字符串数组(是Array<String>简单表达形式)</code></div>
<div class="line number2 index1 alt1"><code class="swift comments">//var a:Array<String>=["hello","world"]</code></div>
<div class="line number3 index2 alt2"><code class="swift keyword">var</code> <code class="swift variable">a</code><code class="swift plain">:[</code><code class="swift color2">String</code><code class="swift plain">]=[</code><code class="swift string">"hello"</code><code class="swift plain">,</code><code class="swift string">"world"</code><code class="swift plain">]</code></div>
<div class="line number4 index3 alt1"><code class="swift variable">a</code><code class="swift plain">[</code><code class="swift value">0</code><code class="swift plain">] </code><code class="swift comments">//访问数组元素</code></div>
<div class="line number5 index4 alt2"> </div>
<div class="line number6 index5 alt1"><code class="swift comments">//下面创建一个Double类型的数组,这里没有使用字面量,当前是一个空数组,当然也可以写成var b:=[]</code></div>
<div class="line number7 index6 alt2"><code class="swift keyword">var</code> <code class="swift variable">b</code><code class="swift plain">=[</code><code class="swift color2">Double</code><code class="swift plain">]()</code></div>
<div class="line number8 index7 alt1"> </div>
<div class="line number9 index8 alt2"><code class="swift keyword">for</code> <code class="swift variable">i</code> <code class="swift keyword">in</code> <code class="swift variable">a</code><code class="swift plain">{</code></div>
<div class="line number10 index9 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"i=\(</code><code class="swift variable">i</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number11 index10 alt2"><code class="swift plain">}</code></div>
<div class="line number12 index11 alt1"> </div>
<div class="line number13 index12 alt2"><code class="swift comments">//添加元素,Swift中可变类型不再由单独的一个类型来表示,统统使用Array,如果想声明为不可变数组只要使用let定义即可</code></div>
<div class="line number14 index13 alt1"><code class="swift variable">a</code><code class="swift plain">.</code><code class="swift variable">append</code><code class="swift plain">(</code><code class="swift string">"!"</code><code class="swift plain">)</code></div>
<div class="line number15 index14 alt2"> </div>
<div class="line number16 index15 alt1"><code class="swift variable">a</code><code class="swift plain">+=[</code><code class="swift string">"I"</code> <code class="swift plain">,</code><code class="swift string">"am"</code> <code class="swift plain">,</code><code class="swift string">"Kenshin"</code><code class="swift plain">] </code><code class="swift comments">//追加元素</code></div>
<div class="line number17 index16 alt2"> </div>
<div class="line number18 index17 alt1"><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"a.count=\(</code><code class="swift variable">a</code><code class="swift plain">.</code><code class="swift color2">count</code><code class="swift string">)"</code><code class="swift plain">) </code><code class="swift comments">//结果:a.count=6</code></div>
<div class="line number19 index18 alt2"> </div>
<div class="line number20 index19 alt1"><code class="swift variable">a</code><code class="swift plain">[</code><code class="swift value">3</code><code class="swift plain">...</code><code class="swift value">5</code><code class="swift plain">]=[</code><code class="swift string">"I"</code><code class="swift plain">,</code><code class="swift string">"Love"</code><code class="swift plain">,</code><code class="swift string">"Swift"</code><code class="swift plain">] </code><code class="swift comments">//修改元素,但是注意无法用这种方式添加元素</code></div>
<div class="line number21 index20 alt2"><code class="swift comments">//a=["."]//这种方式是错误的</code></div>
<div class="line number22 index21 alt1"> </div>
<div class="line number23 index22 alt2"><code class="swift variable">a</code><code class="swift plain">.</code><code class="swift variable">insert</code><code class="swift plain">(</code><code class="swift string">"New"</code><code class="swift plain">, </code><code class="swift variable">atIndex</code><code class="swift plain">: </code><code class="swift value">5</code><code class="swift plain">) </code><code class="swift comments">//插入元素:hello world! I Love New Swift</code></div>
<div class="line number24 index23 alt1"> </div>
<div class="line number25 index24 alt2"><code class="swift variable">a</code><code class="swift plain">.</code><code class="swift variable">removeAtIndex</code><code class="swift plain">(</code><code class="swift value">5</code><code class="swift plain">) </code><code class="swift comments">//删除指定元素</code></div>
<div class="line number26 index25 alt1"> </div>
<div class="line number27 index26 alt2"><code class="swift comments">//使用全局enumerate函数遍历数据索引和元素</code></div>
<div class="line number28 index27 alt1"><code class="swift keyword">for</code> <code class="swift plain">(</code><code class="swift variable">index</code><code class="swift plain">,</code><code class="swift variable">element</code><code class="swift plain">) </code><code class="swift keyword">in</code> <code class="swift color2">enumerate</code><code class="swift plain">(</code><code class="swift variable">a</code><code class="swift plain">){</code></div>
<div class="line number29 index28 alt2"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"index=\(</code><code class="swift variable">index</code><code class="swift string">),element=\(</code><code class="swift variable">element</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number30 index29 alt1"><code class="swift plain">}</code></div>
<div class="line number31 index30 alt2"> </div>
<div class="line number32 index31 alt1"><code class="swift comments">//使用构造函数限制数组元素个数并且指定默认值,等价于var c=Array(count: 3, repeatedValue: 1),自动推断类型</code></div>
<div class="line number33 index32 alt2"><code class="swift keyword">var</code> <code class="swift color2">c</code><code class="swift plain">=[</code><code class="swift color2">Int</code><code class="swift plain">](</code><code class="swift color2">count</code><code class="swift plain">: </code><code class="swift value">3</code><code class="swift plain">, </code><code class="swift variable">repeatedValue</code><code class="swift plain">: </code><code class="swift value">1</code><code class="swift plain">)</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>Set表示没有顺序的集合:</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_743788" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift comments">//注意集合没有类似于数组的简化形式,例如不能写成var a:=["hello","world"]</code></div>
<div class="line number2 index1 alt1"><code class="swift keyword">var</code> <code class="swift variable">a</code><code class="swift plain">:</code><code class="swift variable">Set</code><code class="swift plain"><</code><code class="swift color2">String</code><code class="swift plain">></code><code class="swift plain">=[</code><code class="swift string">"hello"</code><code class="swift plain">,</code><code class="swift string">"world"</code><code class="swift plain">]</code></div>
<div class="line number3 index2 alt2"><code class="swift keyword">var</code> <code class="swift variable">b</code><code class="swift plain">:</code><code class="swift variable">Set</code><code class="swift plain">=[</code><code class="swift value">1</code><code class="swift plain">,</code><code class="swift value">2</code><code class="swift plain">] </code><code class="swift comments">//类型推断:Set<Int></code></div>
<div class="line number4 index3 alt1"> </div>
<div class="line number5 index4 alt2"><code class="swift variable">a</code><code class="swift plain">.</code><code class="swift variable">insert</code><code class="swift plain">(</code><code class="swift string">"!"</code><code class="swift plain">) </code><code class="swift comments">//注意这个插入不保证顺序</code></div>
<div class="line number6 index5 alt1"> </div>
<div class="line number7 index6 alt2"><code class="swift keyword">if</code> <code class="swift plain">!</code><code class="swift variable">a</code><code class="swift plain">.</code><code class="swift variable">isEmpty</code> <code class="swift plain">{ </code><code class="swift comments">//判断是否为空</code></div>
<div class="line number8 index7 alt1"><code class="swift spaces"> </code><code class="swift variable">a</code><code class="swift plain">.</code><code class="swift variable">remove</code><code class="swift plain">(</code><code class="swift string">"!"</code><code class="swift plain">)</code></div>
<div class="line number9 index8 alt2"><code class="swift plain">}</code></div>
<div class="line number10 index9 alt1"> </div>
<div class="line number11 index10 alt2"><code class="swift keyword">if</code> <code class="swift plain">!</code><code class="swift variable">a</code><code class="swift plain">.</code><code class="swift color2">contains</code><code class="swift plain">(</code><code class="swift string">"!"</code><code class="swift plain">){</code></div>
<div class="line number12 index11 alt1"><code class="swift spaces"> </code><code class="swift variable">a</code><code class="swift plain">.</code><code class="swift variable">insert</code><code class="swift plain">(</code><code class="swift string">"!"</code><code class="swift plain">)</code></div>
<div class="line number13 index12 alt2"><code class="swift plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>Dictionary字典同样是没有顺序的,并且在Swift中字典同样要在使用时明确具体的类型。和ObjC中一样,字典必须保证key是唯一的,而这一点就要求在Swift中key必须是可哈希的,不过幸运的是Swift中的基本类型(如Int、Float、Double、Bool、String)都是可哈希的,都可以作为key。</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_409857" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift comments">//通过字面量进行字典初始化,注意等价于var a:Dictionary<Int,String>=</code></div>
<div class="line number2 index1 alt1"><code class="swift keyword">var</code> <code class="swift variable">a</code><code class="swift plain">:[</code><code class="swift color2">Int</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">]=[</code><code class="swift value">200</code><code class="swift plain">:</code><code class="swift string">"success"</code><code class="swift plain">,</code><code class="swift value">404</code><code class="swift plain">:</code><code class="swift string">"not found"</code><code class="swift plain">]</code></div>
<div class="line number3 index2 alt2"><code class="swift keyword">var</code> <code class="swift variable">b</code><code class="swift plain">=[</code><code class="swift value">200</code><code class="swift plain">:</code><code class="swift string">"success"</code><code class="swift plain">,</code><code class="swift value">404</code><code class="swift plain">:</code><code class="swift string">"not found"</code><code class="swift plain">] </code><code class="swift comments">//不声明类型,根据值自动推断类型</code></div>
<div class="line number4 index3 alt1"> </div>
<div class="line number5 index4 alt2"><code class="swift variable">a</code><code class="swift plain">[</code><code class="swift value">200</code><code class="swift plain">] </code><code class="swift comments">//读取字典</code></div>
<div class="line number6 index5 alt1"><code class="swift variable">a</code><code class="swift plain">[</code><code class="swift value">404</code><code class="swift plain">]=</code><code class="swift string">"can not found"</code> <code class="swift comments">//修改</code></div>
<div class="line number7 index6 alt2"> </div>
<div class="line number8 index7 alt1"><code class="swift variable">a</code><code class="swift plain">[</code><code class="swift value">500</code><code class="swift plain">]=</code><code class="swift string">"internal server error"</code> <code class="swift comments">//添加</code></div>
<div class="line number9 index8 alt2"><code class="swift comments">//a=[:] //设置为空字典,等价于:a=()</code></div>
<div class="line number10 index9 alt1"> </div>
<div class="line number11 index10 alt2"><code class="swift keyword">for</code> <code class="swift variable">code</code> <code class="swift keyword">in</code> <code class="swift variable">a</code><code class="swift plain">.</code><code class="swift variable">keys</code><code class="swift plain">{</code></div>
<div class="line number12 index11 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"code=\(</code><code class="swift variable">code</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number13 index12 alt2"><code class="swift plain">}</code></div>
<div class="line number14 index13 alt1"> </div>
<div class="line number15 index14 alt2"><code class="swift keyword">for</code> <code class="swift variable">description</code> <code class="swift keyword">in</code> <code class="swift variable">a</code><code class="swift plain">.</code><code class="swift variable">values</code><code class="swift plain">{</code></div>
<div class="line number16 index15 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"description=\(</code><code class="swift variable">description</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number17 index16 alt2"><code class="swift plain">}</code></div>
<div class="line number18 index17 alt1"> </div>
<div class="line number19 index18 alt2"><code class="swift keyword">for</code> <code class="swift plain">(</code><code class="swift variable">code</code><code class="swift plain">,</code><code class="swift variable">description</code><code class="swift plain">) </code><code class="swift keyword">in</code> <code class="swift variable">a</code><code class="swift plain">{</code></div>
<div class="line number20 index19 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"code=\(</code><code class="swift variable">code</code><code class="swift string">),description=\(</code><code class="swift variable">description</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number21 index20 alt2"><code class="swift plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>注意:在Swift中集合的可变性不是像ObjC一样由单独的数据类型来控制的,而是通过变量和常量来控制,这一点和其他高级语言比较类似。</p>
<h3 id="tuple">元组(Tuple)</h3>
<p>在开发过程中有时候会希望临时组织一个数据类型,此时可以使用一个结构体或者类,但是由于这个类型并没有那么复杂,如果定义起来又比较麻烦,此时可以考虑使用元组。</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_713500" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
<div class="line number38 index37 alt1">38</div>
<div class="line number39 index38 alt2">39</div>
<div class="line number40 index39 alt1">40</div>
<div class="line number41 index40 alt2">41</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift comments">/**</code></div>
<div class="line number2 index1 alt1"><code class="swift spaces"> </code><code class="swift comments">* 元组的基本用法</code></div>
<div class="line number3 index2 alt2"><code class="swift spaces"> </code><code class="swift comments">*/</code></div>
<div class="line number4 index3 alt1"><code class="swift keyword">var</code> <code class="swift variable">point</code><code class="swift plain">=(</code><code class="swift variable">x</code><code class="swift plain">:</code><code class="swift value">50</code><code class="swift plain">,</code><code class="swift variable">y</code><code class="swift plain">:</code><code class="swift value">100</code><code class="swift plain">) </code><code class="swift comments">//自动推断其类型:(Int,Int)</code></div>
<div class="line number5 index4 alt2"><code class="swift variable">point</code><code class="swift plain">.</code><code class="swift variable">x</code> <code class="swift comments">//可以用类似于结构体的方式直接访问元素,结果:50</code></div>
<div class="line number6 index5 alt1"><code class="swift variable">point</code><code class="swift plain">.</code><code class="swift variable">y</code> <code class="swift comments">//结果:100</code></div>
<div class="line number7 index6 alt2"><code class="swift variable">point</code><code class="swift plain">.</code><code class="swift value">0</code> <code class="swift comments">//也可以采用类似数组的方式使用下标访问,结果:50</code></div>
<div class="line number8 index7 alt1"><code class="swift variable">point</code><code class="swift plain">.</code><code class="swift value">1</code> <code class="swift comments">//结果:100</code></div>
<div class="line number9 index8 alt2"> </div>
<div class="line number10 index9 alt1"><code class="swift comments">//元组也可以不指定元素名称,访问的时候只能使用下标</code></div>
<div class="line number11 index10 alt2"><code class="swift keyword">let</code> <code class="swift variable">frame</code><code class="swift plain">:(</code><code class="swift color2">Int</code><code class="swift plain">,</code><code class="swift color2">Int</code><code class="swift plain">,</code><code class="swift color2">Int</code><code class="swift plain">,</code><code class="swift color2">Float</code><code class="swift plain">)=(</code><code class="swift value">0</code><code class="swift plain">,</code><code class="swift value">0</code><code class="swift plain">,</code><code class="swift value">100</code><code class="swift plain">,</code><code class="swift value">100.0</code><code class="swift plain">)</code></div>
<div class="line number12 index11 alt1"><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift variable">frame</code><code class="swift plain">) </code><code class="swift comments">//结果:(0, 0, 100, 100.0)</code></div>
<div class="line number13 index12 alt2"> </div>
<div class="line number14 index13 alt1"><code class="swift comments">//注意下面的语句是错误的,如果指定了元组的类型则无法指定元素名称</code></div>
<div class="line number15 index14 alt2"><code class="swift comments">//let frame:(Int,Int,Int,Int)=(x:0,y:0,width:100,height:100)</code></div>
<div class="line number16 index15 alt1"> </div>
<div class="line number17 index16 alt2"> </div>
<div class="line number18 index17 alt1"><code class="swift keyword">var</code> <code class="swift variable">size</code><code class="swift plain">=(</code><code class="swift variable">width</code><code class="swift plain">:</code><code class="swift value">100</code><code class="swift plain">,</code><code class="swift value">25</code><code class="swift plain">) </code><code class="swift comments">//仅仅给其中一个元素命名</code></div>
<div class="line number19 index18 alt2"><code class="swift variable">size</code><code class="swift plain">.</code><code class="swift variable">width</code> <code class="swift comments">//结果:100</code></div>
<div class="line number20 index19 alt1"><code class="swift variable">size</code><code class="swift plain">.</code><code class="swift value">1</code> <code class="swift comments">//结果:25</code></div>
<div class="line number21 index20 alt2"> </div>
<div class="line number22 index21 alt1"> </div>
<div class="line number23 index22 alt2"><code class="swift keyword">var</code> <code class="swift variable">httpStatus</code><code class="swift plain">:(</code><code class="swift color2">Int</code><code class="swift plain">,</code><code class="swift color2">String</code><code class="swift plain">)=(</code><code class="swift value">200</code><code class="swift plain">,</code><code class="swift string">"success"</code><code class="swift plain">) </code><code class="swift comments">//元组的元素类型并不一定相同</code></div>
<div class="line number24 index23 alt1"> </div>
<div class="line number25 index24 alt2"><code class="swift keyword">var</code> <code class="swift plain">(</code><code class="swift variable">status</code><code class="swift plain">,</code><code class="swift variable">description</code><code class="swift plain">)=</code><code class="swift variable">httpStatus</code> <code class="swift comments">//一次性赋值给多个变量,此时status=200,description="success"</code></div>
<div class="line number26 index25 alt1"> </div>
<div class="line number27 index26 alt2"><code class="swift comments">//接收元组的其中一个值忽略另一个值使用"_"(注意在Swift中很多情况下使用_忽略某个值或变量)</code></div>
<div class="line number28 index27 alt1"><code class="swift keyword">var</code> <code class="swift plain">(</code><code class="swift variable">sta</code><code class="swift plain">,</code><code class="swift value">_</code><code class="swift plain">)=</code><code class="swift variable">httpStatus</code></div>
<div class="line number29 index28 alt2"><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"sta=\(</code><code class="swift variable">sta</code><code class="swift string">)"</code><code class="swift plain">) </code><code class="swift comments">//结果:sta=200</code></div>
<div class="line number30 index29 alt1"> </div>
<div class="line number31 index30 alt2"><code class="swift comments">/**</code></div>
<div class="line number32 index31 alt1"><code class="swift spaces"> </code><code class="swift comments">* 元组作为函数的参数或返回值,借助元组实现了函数的多个返回值</code></div>
<div class="line number33 index32 alt2"><code class="swift spaces"> </code><code class="swift comments">*/</code></div>
<div class="line number34 index33 alt1"><code class="swift keyword">func</code> <code class="swift variable">request</code><code class="swift plain">()-</code><code class="swift plain">></code><code class="swift plain">(</code><code class="swift variable">code</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">,</code><code class="swift variable">description</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">){</code></div>
<div class="line number35 index34 alt2"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift plain">(</code><code class="swift value">404</code><code class="swift plain">,</code><code class="swift string">"not found"</code><code class="swift plain">)</code></div>
<div class="line number36 index35 alt1"><code class="swift plain">}</code></div>
<div class="line number37 index36 alt2"><code class="swift keyword">var</code> <code class="swift variable">result</code><code class="swift plain">=</code><code class="swift variable">request</code><code class="swift plain">()</code></div>
<div class="line number38 index37 alt1"><code class="swift variable">result</code><code class="swift plain">.</code><code class="swift value">0</code> <code class="swift comments">//结果:404</code></div>
<div class="line number39 index38 alt2"><code class="swift variable">result</code><code class="swift plain">.</code><code class="swift value">1</code> <code class="swift comments">//结果:not found</code></div>
<div class="line number40 index39 alt1"><code class="swift variable">result</code><code class="swift plain">.</code><code class="swift variable">code</code> <code class="swift comments">//结果:404</code></div>
<div class="line number41 index40 alt2"><code class="swift variable">result</code><code class="swift plain">.</code><code class="swift variable">description</code> <code class="swift comments">//结果:not found</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<h3 id="optional">可选类型</h3>
<p>所谓可选类型就是一个变量或常量可能有值也可能没有值则设置为可选类型。在ObjC中如果一个对象类型没有赋值,则默认为nil,同时nil类型也只能作为对象类型的默认值,对于类似于Int等基本类型则对应0这样的默认值。由于Swift是强类型语言,如果在声明变量或常量时没有进行赋值,Swift并不会默认设置初值(这一点和其他高级语言不太一样,例如C#虽然也有可选类型,但是要求并没有那么严格)。</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_454699" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift comments">/**</code></div>
<div class="line number2 index1 alt1"><code class="swift spaces"> </code><code class="swift comments">* 可选类型基础</code></div>
<div class="line number3 index2 alt2"><code class="swift spaces"> </code><code class="swift comments">*/</code></div>
<div class="line number4 index3 alt1"><code class="swift keyword">var</code> <code class="swift variable">x</code><code class="swift plain">:</code><code class="swift color2">Float</code><code class="swift plain">? </code><code class="swift comments">//使用?声明成一个可选类型,如果不赋值默认为nil</code></div>
<div class="line number5 index4 alt2"><code class="swift variable">x</code><code class="swift plain">=</code><code class="swift value">172.0</code></div>
<div class="line number6 index5 alt1"> </div>
<div class="line number7 index6 alt2"><code class="swift keyword">var</code> <code class="swift variable">y</code><code class="swift plain">:</code><code class="swift color2">Float</code><code class="swift plain">=</code><code class="swift value">60.0</code></div>
<div class="line number8 index7 alt1"> </div>
<div class="line number9 index8 alt2"><code class="swift comments">//var z=x+y //注意此句报错,因为Int和Int?根本就是两种不同的类型,在Swift中两种不同的类型不能运算(因为不会自动进行类型转化)</code></div>
<div class="line number10 index9 alt1"><code class="swift keyword">var</code> <code class="swift variable">z</code><code class="swift plain">=</code><code class="swift variable">x</code><code class="swift plain">!+</code><code class="swift variable">y</code> <code class="swift comments">//使用!进行强制解包</code></div>
<div class="line number11 index10 alt2"> </div>
<div class="line number12 index11 alt1"><code class="swift keyword">var</code> <code class="swift variable">age</code><code class="swift plain">=</code><code class="swift string">"29"</code></div>
<div class="line number13 index12 alt2"><code class="swift keyword">var</code> <code class="swift variable">ageInt</code><code class="swift plain">=</code><code class="swift variable">age</code><code class="swift plain">.</code><code class="swift variable">toInt</code><code class="swift plain">() </code><code class="swift comments">//注意ageInt是Int可选类型而不是Int类型(因为String的toInt()方法并不能保证其一定能转化为Int类型)</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<ol>
<li>Swift中类似于Int和Int?并不是同一种类型,不能进行相关运算,如果要运算只能解包;</li>
<li>可选类型其本质就是此类型内部存储分为“Some”和“None”两个部分,如果有值则存储到“Some”中,没有值则为“None”(早期Playground中可以看到两个部分,如今已经取消显示Some等描述了),使用感叹号强制解包的过程就是取出“Some”部分;</li>
</ol>
<p>既然可选类型有可能有值,也可能没有值那么往往有时候就需要判断。可以使用if直接判断一个可选类型是否为nil,这样一来就可以根据情况进行强制解包(从Some部分取出值的过程);另一个选择就是在判断的同时如果有值则将值赋值给一个临时变量或常量,否则不进入此条件语句,这个过程称之为“可选绑定”。</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_450934" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift comments">/**</code></div>
<div class="line number2 index1 alt1"><code class="swift comments">* 可选类型判断</code></div>
<div class="line number3 index2 alt2"><code class="swift comments">*/</code></div>
<div class="line number4 index3 alt1"><code class="swift keyword">var</code> <code class="swift variable">age</code><code class="swift plain">=</code><code class="swift string">"29"</code></div>
<div class="line number5 index4 alt2"><code class="swift keyword">var</code> <code class="swift variable">ageInt</code><code class="swift plain">=</code><code class="swift variable">age</code><code class="swift plain">.</code><code class="swift variable">toInt</code><code class="swift plain">() </code><code class="swift comments">//注意ageInt是Int可选类型而不是Int类型(因为String的toInt()方法并不能保证其一定能转化为Int类型)</code></div>
<div class="line number6 index5 alt1"> </div>
<div class="line number7 index6 alt2"><code class="swift keyword">if</code> <code class="swift variable">ageInt</code><code class="swift plain">==</code><code class="swift color2">nil</code> <code class="swift plain">{</code></div>
<div class="line number8 index7 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"ageInt=nil"</code><code class="swift plain">)</code></div>
<div class="line number9 index8 alt2"><code class="swift plain">}</code><code class="swift keyword">else</code><code class="swift plain">{</code></div>
<div class="line number10 index9 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"ageInt=\(</code><code class="swift variable">ageInt</code><code class="swift plain">!</code><code class="swift string">)"</code><code class="swift plain">) </code><code class="swift comments">//注意这里使用感叹号!强制解析</code></div>
<div class="line number11 index10 alt2"><code class="swift plain">}</code></div>
<div class="line number12 index11 alt1"> </div>
<div class="line number13 index12 alt2"><code class="swift comments">/**</code></div>
<div class="line number14 index13 alt1"><code class="swift spaces"> </code><code class="swift comments">* 可选类型绑定</code></div>
<div class="line number15 index14 alt2"><code class="swift spaces"> </code><code class="swift comments">* 如果可选类型有值则将值赋值给一个临时变量或者常量(此时此变量或者常量接受的值已经不是可选类型),如果没有值则不执行此条件</code></div>
<div class="line number16 index15 alt1"><code class="swift spaces"> </code><code class="swift comments">*/</code></div>
<div class="line number17 index16 alt2"><code class="swift keyword">if</code> <code class="swift keyword">let</code> <code class="swift variable">newAge</code><code class="swift plain">=</code><code class="swift variable">ageInt</code><code class="swift plain">{ </code><code class="swift comments">//此时newAge可以定义成常量也可以定义成变量</code></div>
<div class="line number18 index17 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"newAge=\(</code><code class="swift variable">newAge</code><code class="swift string">)"</code><code class="swift plain">) </code><code class="swift comments">//注意这里并不需要对newAge强制解包</code></div>
<div class="line number19 index18 alt2"><code class="swift plain">}</code><code class="swift keyword">else</code><code class="swift plain">{</code></div>
<div class="line number20 index19 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"ageInt=nil"</code><code class="swift plain">)</code></div>
<div class="line number21 index20 alt2"><code class="swift plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>通过前面的演示可以看出Swift中的可选绑定如果实际计算不得不进行强制解包,如果<strong>一个可选类型从第一次赋值之后就能保证有值</strong>那么使用时就不必进行强制解包了,<strong>这种情况下可以使用隐式可选解析类型</strong>(通过感叹号声明而不是问号)</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_613649" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift comments">/**</code></div>
<div class="line number2 index1 alt1"><code class="swift comments">* 隐式解析可选类型</code></div>
<div class="line number3 index2 alt2"><code class="swift comments">*/</code></div>
<div class="line number4 index3 alt1"><code class="swift keyword">var</code> <code class="swift variable">age</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">!=</code><code class="swift value">0</code> <code class="swift comments">//通过感叹号声明隐式解析可选类型,此后使用时虽然是可选类型但是不用强制解包</code></div>
<div class="line number5 index4 alt2"><code class="swift variable">age</code><code class="swift plain">=</code><code class="swift value">29</code></div>
<div class="line number6 index5 alt1"><code class="swift keyword">var</code> <code class="swift variable">newAge</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">=</code><code class="swift variable">age</code> <code class="swift comments">//不用强制解包直接赋值给Int类型(程序会自动解包)</code></div>
<div class="line number7 index6 alt2"> </div>
<div class="line number8 index7 alt1"><code class="swift keyword">if</code> <code class="swift keyword">var</code> <code class="swift variable">tempAge</code><code class="swift plain">=</code><code class="swift variable">age</code> <code class="swift plain">{</code></div>
<div class="line number9 index8 alt2"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"tempAge=\(</code><code class="swift variable">tempAge</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number10 index9 alt1"><code class="swift plain">}</code><code class="swift keyword">else</code><code class="swift plain">{</code></div>
<div class="line number11 index10 alt2"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"age=nil"</code><code class="swift plain">)</code></div>
<div class="line number12 index11 alt1"><code class="swift plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<h3 id="operator">运算符</h3>
<p>Swift中支持绝大多数C语言的运算符并改进以减少不必要的错误(例如等号赋值后不返回值),算术运算会检查溢出情况,必要时还能使用新增的溢出运算符。另外Swift中还可以对浮点数使用取余运算符,新增了区间运算符。对于基本的运算符这里不再一一介绍,简单看一下Swift中的区间运算符和溢出运算符。</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_689491" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift comments">/**</code></div>
<div class="line number2 index1 alt1"><code class="swift spaces"> </code><code class="swift comments">* 区间运算符,通常用于整形或者字符范围(例如"a"..."z")</code></div>
<div class="line number3 index2 alt2"><code class="swift spaces"> </code><code class="swift comments">*/</code></div>
<div class="line number4 index3 alt1"><code class="swift keyword">for</code> <code class="swift variable">i</code> <code class="swift keyword">in</code> <code class="swift value">1</code><code class="swift plain">...</code><code class="swift value">5</code> <code class="swift plain">{ </code><code class="swift comments">//闭区间运算符...(从1到5,包含5)</code></div>
<div class="line number5 index4 alt2"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"i=\(</code><code class="swift variable">i</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number6 index5 alt1"><code class="swift plain">}</code></div>
<div class="line number7 index6 alt2"> </div>
<div class="line number8 index7 alt1"><code class="swift keyword">for</code> <code class="swift variable">i</code> <code class="swift keyword">in</code> <code class="swift value">1</code><code class="swift plain">..</code><code class="swift plain"><</code><code class="swift value">5</code><code class="swift plain">{ </code><code class="swift comments">//半开区间运算符..<(从1到4)</code></div>
<div class="line number9 index8 alt2"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"i=\(</code><code class="swift variable">i</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number10 index9 alt1"><code class="swift plain">}</code></div>
<div class="line number11 index10 alt2"> </div>
<div class="line number12 index11 alt1"><code class="swift keyword">var</code> <code class="swift variable">str</code> <code class="swift plain">= </code><code class="swift string">"hello world."</code></div>
<div class="line number13 index12 alt2"><code class="swift keyword">var</code> <code class="swift variable">range</code><code class="swift plain">=</code><code class="swift string">"a"</code><code class="swift plain">...</code><code class="swift string">"z"</code></div>
<div class="line number14 index13 alt1"><code class="swift keyword">for</code> <code class="swift variable">t</code> <code class="swift keyword">in</code> <code class="swift variable">str</code> <code class="swift plain">{</code></div>
<div class="line number15 index14 alt2"><code class="swift spaces"> </code><code class="swift keyword">if</code> <code class="swift variable">range</code><code class="swift plain">.</code><code class="swift color2">contains</code><code class="swift plain">(</code><code class="swift color2">String</code><code class="swift plain">(</code><code class="swift variable">t</code><code class="swift plain">)) {</code></div>
<div class="line number16 index15 alt1"><code class="swift spaces"> </code><code class="swift color2">print</code><code class="swift plain">(</code><code class="swift variable">t</code><code class="swift plain">) </code><code class="swift comments">//结果:helloworld</code></div>
<div class="line number17 index16 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number18 index17 alt1"><code class="swift plain">}</code></div>
<div class="line number19 index18 alt2"> </div>
<div class="line number20 index19 alt1"><code class="swift comments">/**</code></div>
<div class="line number21 index20 alt2"><code class="swift spaces"> </code><code class="swift comments">* 溢出运算符</code></div>
<div class="line number22 index21 alt1"><code class="swift spaces"> </code><code class="swift comments">*/</code></div>
<div class="line number23 index22 alt2"><code class="swift keyword">var</code> <code class="swift variable">a</code><code class="swift plain">=</code><code class="swift color2">UInt8</code><code class="swift plain">.</code><code class="swift color2">max</code> <code class="swift comments">//a=255</code></div>
<div class="line number24 index23 alt1"><code class="swift comments">//var b:UInt8=a+1 //注意b会出现溢出,此句报错</code></div>
<div class="line number25 index24 alt2"> </div>
<div class="line number26 index25 alt1"><code class="swift comments">//下面使用溢出运算符,结果为:0,类似的还有&-、&*、&/</code></div>
<div class="line number27 index26 alt2"><code class="swift comments">//使用溢出运算符可以在最大值和最小值之前循环而不会报错</code></div>
<div class="line number28 index27 alt1"><code class="swift keyword">var</code> <code class="swift variable">b</code><code class="swift plain">:</code><code class="swift color2">UInt8</code><code class="swift plain">=</code><code class="swift variable">a</code> <code class="swift plain">&</code><code class="swift plain">+ </code><code class="swift value">1</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p> 溢出运算符的原理其实很简单,例如对于UInt8,如果8位均为1则十进制表示是255,但是当加1之后则变成了9位“100000000”,出现了溢出但是UInt8本身值只能存储8位,所以取后面8位就变成了“00000000”,十进制表示就是0。</p>
<h2 id="controlFlow"> 控制流</h2>
<p>Swift中的多数控制流和其他语言差别并不大,例如for、while、do while、if、switch等,而且有些前面已经使用过(例如for in循环),这里将着重介绍一些不同点。</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_510965" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
<div class="line number38 index37 alt1">38</div>
<div class="line number39 index38 alt2">39</div>
<div class="line number40 index39 alt1">40</div>
<div class="line number41 index40 alt2">41</div>
<div class="line number42 index41 alt1">42</div>
<div class="line number43 index42 alt2">43</div>
<div class="line number44 index43 alt1">44</div>
<div class="line number45 index44 alt2">45</div>
<div class="line number46 index45 alt1">46</div>
<div class="line number47 index46 alt2">47</div>
<div class="line number48 index47 alt1">48</div>
<div class="line number49 index48 alt2">49</div>
<div class="line number50 index49 alt1">50</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift keyword">var</code> <code class="swift variable">a</code><code class="swift plain">=[</code><code class="swift string">"a"</code><code class="swift plain">,</code><code class="swift string">"b"</code><code class="swift plain">,</code><code class="swift string">"c"</code><code class="swift plain">,</code><code class="swift string">"d"</code><code class="swift plain">,</code><code class="swift string">"e"</code><code class="swift plain">,</code><code class="swift string">"f"</code><code class="swift plain">,</code><code class="swift string">"g"</code><code class="swift plain">]</code></div>
<div class="line number2 index1 alt1"><code class="swift keyword">let</code> <code class="swift variable">b</code><code class="swift plain">=</code><code class="swift variable">a</code><code class="swift plain">[</code><code class="swift value">1</code><code class="swift plain">]</code></div>
<div class="line number3 index2 alt2"><code class="swift comments">/**</code></div>
<div class="line number4 index3 alt1"><code class="swift comments">* switch支持一个case多个模式匹配,同时case后不用写break也会在匹配到种情况后自动跳出匹配,不存在隐式贯穿,如果想要贯穿在case之后添加"fallthrough"关键字</code></div>
<div class="line number5 index4 alt2"><code class="swift comments">*/</code></div>
<div class="line number6 index5 alt1"><code class="swift keyword">switch</code> <code class="swift variable">b</code><code class="swift plain">{</code></div>
<div class="line number7 index6 alt2"><code class="swift keyword">case</code> <code class="swift string">"a"</code><code class="swift plain">,</code><code class="swift string">"b"</code><code class="swift plain">:</code></div>
<div class="line number8 index7 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"b=a or b=b"</code><code class="swift plain">)</code></div>
<div class="line number9 index8 alt2"><code class="swift keyword">case</code> <code class="swift string">"c"</code><code class="swift plain">,</code><code class="swift string">"d"</code><code class="swift plain">,</code><code class="swift string">"e"</code><code class="swift plain">,</code><code class="swift string">"f"</code><code class="swift plain">:</code></div>
<div class="line number10 index9 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"b in (c,d,e,f)"</code><code class="swift plain">)</code></div>
<div class="line number11 index10 alt2"><code class="swift keyword">default</code><code class="swift plain">:</code></div>
<div class="line number12 index11 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"b=g"</code><code class="swift plain">)</code></div>
<div class="line number13 index12 alt2"><code class="swift plain">}</code></div>
<div class="line number14 index13 alt1"> </div>
<div class="line number15 index14 alt2"><code class="swift comments">/**</code></div>
<div class="line number16 index15 alt1"><code class="swift spaces"> </code><code class="swift comments">* 匹配区间,同时注意switch必须匹配所有情况,否则必须加上default</code></div>
<div class="line number17 index16 alt2"><code class="swift spaces"> </code><code class="swift comments">*/</code></div>
<div class="line number18 index17 alt1"> </div>
<div class="line number19 index18 alt2"><code class="swift keyword">let</code> <code class="swift color2">c</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">=</code><code class="swift value">88</code></div>
<div class="line number20 index19 alt1"><code class="swift keyword">switch</code> <code class="swift color2">c</code><code class="swift plain">{</code></div>
<div class="line number21 index20 alt2"><code class="swift keyword">case</code> <code class="swift value">1</code><code class="swift plain">...</code><code class="swift value">60</code><code class="swift plain">:</code></div>
<div class="line number22 index21 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"1-60"</code><code class="swift plain">)</code></div>
<div class="line number23 index22 alt2"><code class="swift keyword">case</code> <code class="swift value">61</code><code class="swift plain">...</code><code class="swift value">90</code><code class="swift plain">:</code></div>
<div class="line number24 index23 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"61-90"</code><code class="swift plain">)</code></div>
<div class="line number25 index24 alt2"><code class="swift keyword">case</code> <code class="swift value">91</code><code class="swift plain">...</code><code class="swift value">100</code><code class="swift plain">:</code></div>
<div class="line number26 index25 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"91-100"</code><code class="swift plain">)</code></div>
<div class="line number27 index26 alt2"><code class="swift keyword">default</code><code class="swift plain">:</code></div>
<div class="line number28 index27 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"1>c>100"</code><code class="swift plain">)</code></div>
<div class="line number29 index28 alt2"><code class="swift plain">}</code></div>
<div class="line number30 index29 alt1"> </div>
<div class="line number31 index30 alt2"><code class="swift comments">/**</code></div>
<div class="line number32 index31 alt1"><code class="swift comments">* 元组匹配、值绑定、where条件匹配</code></div>
<div class="line number33 index32 alt2"><code class="swift comments">* 注意下面的匹配没有default,因为它包含了所有情况</code></div>
<div class="line number34 index33 alt1"><code class="swift comments">*/</code></div>
<div class="line number35 index34 alt2"><code class="swift keyword">var</code> <code class="swift variable">d</code><code class="swift plain">=(</code><code class="swift variable">x</code><code class="swift plain">:</code><code class="swift value">900</code><code class="swift plain">,</code><code class="swift variable">y</code><code class="swift plain">:</code><code class="swift value">0</code><code class="swift plain">)</code></div>
<div class="line number36 index35 alt1"><code class="swift keyword">switch</code> <code class="swift variable">d</code><code class="swift plain">{</code></div>
<div class="line number37 index36 alt2"><code class="swift keyword">case</code> <code class="swift plain">(</code><code class="swift value">0</code><code class="swift plain">,</code><code class="swift value">0</code><code class="swift plain">):</code></div>
<div class="line number38 index37 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"d in (0,0)"</code><code class="swift plain">)</code></div>
<div class="line number39 index38 alt2"><code class="swift keyword">case</code> <code class="swift plain">(</code><code class="swift value">_</code><code class="swift plain">,</code><code class="swift value">0</code><code class="swift plain">): </code><code class="swift comments">//忽略x值匹配</code></div>
<div class="line number40 index39 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"d in y"</code><code class="swift plain">)</code></div>
<div class="line number41 index40 alt2"><code class="swift keyword">case</code> <code class="swift plain">(</code><code class="swift value">0</code><code class="swift plain">,</code><code class="swift keyword">let</code> <code class="swift variable">y</code><code class="swift plain">):</code><code class="swift comments">//值绑定</code></div>
<div class="line number42 index41 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"d in x,y=\(</code><code class="swift variable">y</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number43 index42 alt2"><code class="swift keyword">case</code> <code class="swift plain">(-</code><code class="swift value">100</code><code class="swift plain">...</code><code class="swift value">100</code><code class="swift plain">,-</code><code class="swift value">100</code><code class="swift plain">...</code><code class="swift value">100</code><code class="swift plain">): </code><code class="swift comments">//注意这里有可能和第一、二、三个条件重合,但是Swift允许多个case匹配同一个条件,但是只会执行第一个匹配</code></div>
<div class="line number44 index43 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"x in(0-100),y in (0-100)"</code><code class="swift plain">)</code></div>
<div class="line number45 index44 alt2"><code class="swift keyword">case</code> <code class="swift keyword">let</code> <code class="swift plain">(</code><code class="swift variable">x</code><code class="swift plain">,</code><code class="swift variable">y</code><code class="swift plain">) </code><code class="swift keyword">where</code> <code class="swift variable">x</code><code class="swift plain">==</code><code class="swift variable">y</code><code class="swift plain">: </code><code class="swift comments">//where条件匹配,注意这里的写法等同于:(let x,let y) where x==y</code></div>
<div class="line number46 index45 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"x=y=\(</code><code class="swift variable">x</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number47 index46 alt2"><code class="swift keyword">case</code> <code class="swift keyword">let</code> <code class="swift plain">(</code><code class="swift variable">x</code><code class="swift plain">, </code><code class="swift variable">y</code><code class="swift plain">):</code></div>
<div class="line number48 index47 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"x=\(</code><code class="swift variable">x</code><code class="swift string">),y=\(</code><code class="swift variable">y</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number49 index48 alt2"><code class="swift spaces"> </code> </div>
<div class="line number50 index49 alt1"><code class="swift plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>在其他语言中通常可以使用break、continue、return(Swift中添加了fallthrough)等来终止或者跳出某个执行语句,但是对于其行为往往是具有固定性的,例如break只能终止其所在的内层循环,而return只能跳出它所在的函数。在Swift中这种控制转移功能得到了加强,那就是使用标签。利用标签你可以随意指定转移的位置,例如下面的代码演示了如何直接通过标签跳出最外层循环:</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_113857" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift keyword">var</code> <code class="swift variable">a</code><code class="swift plain">=</code><code class="swift value">5</code></div>
<div class="line number2 index1 alt1"><code class="swift variable">whileLoop</code><code class="swift plain">:</code></div>
<div class="line number3 index2 alt2"><code class="swift keyword">while</code> <code class="swift plain">--</code><code class="swift variable">a</code><code class="swift plain">></code><code class="swift value">0</code> <code class="swift plain">{</code></div>
<div class="line number4 index3 alt1"><code class="swift spaces"> </code><code class="swift keyword">for</code> <code class="swift keyword">var</code> <code class="swift variable">i</code><code class="swift plain">=</code><code class="swift value">0</code><code class="swift plain">;</code><code class="swift variable">i</code><code class="swift plain"><</code><code class="swift variable">a</code><code class="swift plain">;++</code><code class="swift variable">i</code><code class="swift plain">{</code></div>
<div class="line number5 index4 alt2"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"a=\(</code><code class="swift variable">a</code><code class="swift string">),i=\(</code><code class="swift variable">i</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number6 index5 alt1"><code class="swift spaces"> </code> </div>
<div class="line number7 index6 alt2"><code class="swift spaces"> </code><code class="swift keyword">break</code> <code class="swift variable">whileLoop</code></div>
<div class="line number8 index7 alt1"><code class="swift spaces"> </code><code class="swift comments">//如果此处直接使用break将跳出for循环,而由于这里使用标签直接跳出了while,结果只会打印一次,其结果为:a=4,i=0</code></div>
<div class="line number9 index8 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number10 index9 alt1"><code class="swift plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<h1 id="functionAndClosures">函数和闭包</h1>
<h2 id="function">函数</h2>
<p>函数是一个完成独立任务的代码块,Swift中的函数不仅可以像C语言中的函数一样作为函数的参数和返回值,而且还支持嵌套,并且有C#一样的函数参数默认值、可变参数等。</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_119738" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift comments">//定义一个函数,注意参数和返回值,如果没有返回值可以不写返回值或者写成Void、空元组()(注意Void的本质就是空元组)</code></div>
<div class="line number2 index1 alt1"><code class="swift keyword">func</code> <code class="swift variable">sum</code><code class="swift plain">(</code><code class="swift variable">num1</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">,</code><code class="swift variable">num2</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">)-</code><code class="swift plain">></code><code class="swift color2">Int</code><code class="swift plain">{</code></div>
<div class="line number3 index2 alt2"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift variable">num1</code> <code class="swift plain">+ </code><code class="swift variable">num2</code></div>
<div class="line number4 index3 alt1"><code class="swift plain">}</code></div>
<div class="line number5 index4 alt2"> </div>
<div class="line number6 index5 alt1"><code class="swift variable">sum</code><code class="swift plain">(</code><code class="swift value">1</code><code class="swift plain">, </code><code class="swift value">2</code><code class="swift plain">)</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>可以看到Swift中的函数仅仅表达形式有所区别(定义形式类似于Javascript,但是js不用书写返回值),但是本质并没有太大的区别。不过Swift中对函数参数强调两个概念就是局部参数名(又叫“形式参数”)和外部参数名,这极大的照顾到了ObjC开发者的开发体验。在上面的例子中调用sum函数并没有传递任何参数名,因为num1、num2仅仅作为局部参数名在函数内部使用,但是如果给函数指定一个外部参数名在调用时就必须指定参数名。另外前面也提到关于Swift中的默认参数、可变长度的参数,包括一些高级语言中的输入输出参数,通过下面的例子大家会有一个全面的了解。</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_327985" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
<div class="line number38 index37 alt1">38</div>
<div class="line number39 index38 alt2">39</div>
<div class="line number40 index39 alt1">40</div>
<div class="line number41 index40 alt2">41</div>
<div class="line number42 index41 alt1">42</div>
<div class="line number43 index42 alt2">43</div>
<div class="line number44 index43 alt1">44</div>
<div class="line number45 index44 alt2">45</div>
<div class="line number46 index45 alt1">46</div>
<div class="line number47 index46 alt2">47</div>
<div class="line number48 index47 alt1">48</div>
<div class="line number49 index48 alt2">49</div>
<div class="line number50 index49 alt1">50</div>
<div class="line number51 index50 alt2">51</div>
<div class="line number52 index51 alt1">52</div>
<div class="line number53 index52 alt2">53</div>
<div class="line number54 index53 alt1">54</div>
<div class="line number55 index54 alt2">55</div>
<div class="line number56 index55 alt1">56</div>
<div class="line number57 index56 alt2">57</div>
<div class="line number58 index57 alt1">58</div>
<div class="line number59 index58 alt2">59</div>
<div class="line number60 index59 alt1">60</div>
<div class="line number61 index60 alt2">61</div>
<div class="line number62 index61 alt1">62</div>
<div class="line number63 index62 alt2">63</div>
<div class="line number64 index63 alt1">64</div>
<div class="line number65 index64 alt2">65</div>
<div class="line number66 index65 alt1">66</div>
<div class="line number67 index66 alt2">67</div>
<div class="line number68 index67 alt1">68</div>
<div class="line number69 index68 alt2">69</div>
<div class="line number70 index69 alt1">70</div>
<div class="line number71 index70 alt2">71</div>
<div class="line number72 index71 alt1">72</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift plain">/**</code></div>
<div class="line number2 index1 alt1"><code class="swift plain">/**</code></div>
<div class="line number3 index2 alt2"><code class="swift plain">* 函数参数名分为局部参数名和外部参数名</code></div>
<div class="line number4 index3 alt1"><code class="swift plain">*/</code></div>
<div class="line number5 index4 alt2"><code class="swift keyword">func</code> <code class="swift color2">split</code><code class="swift plain">(</code><code class="swift variable">string</code> <code class="swift variable">a</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">,</code><code class="swift variable">seperator</code> <code class="swift variable">b</code><code class="swift plain">:</code><code class="swift color2">Character</code><code class="swift plain">)-</code><code class="swift plain">></code><code class="swift plain">[</code><code class="swift color2">String</code><code class="swift plain">]{</code></div>
<div class="line number6 index5 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift color2">split</code><code class="swift plain">(</code><code class="swift variable">a</code><code class="swift plain">, </code><code class="swift variable">maxSplit</code><code class="swift plain">: </code><code class="swift color2">Int</code><code class="swift plain">.</code><code class="swift color2">max</code><code class="swift plain">, </code><code class="swift variable">allowEmptySlices</code><code class="swift plain">: </code><code class="swift color2">false</code><code class="swift plain">, </code><code class="swift variable">isSeparator</code><code class="swift plain">: {$</code><code class="swift value">0</code><code class="swift plain">==</code><code class="swift variable">b</code><code class="swift plain">})</code></div>
<div class="line number7 index6 alt2"><code class="swift plain">}</code></div>
<div class="line number8 index7 alt1"> </div>
<div class="line number9 index8 alt2"><code class="swift comments">//由于给split函数设置了外部参数名string和seperator,所以执行的时候必须带上外部参数名,此处可以看到一个有意义的外部参数名大大节省开发者使用成本</code></div>
<div class="line number10 index9 alt1"><code class="swift color2">split</code><code class="swift plain">(</code><code class="swift variable">string</code><code class="swift plain">: </code><code class="swift string">"hello,world,!"</code><code class="swift plain">, </code><code class="swift variable">seperator</code><code class="swift plain">: </code><code class="swift string">","</code><code class="swift plain">) </code><code class="swift comments">//结果:["hello", "world", "!"]</code></div>
<div class="line number11 index10 alt2"> </div>
<div class="line number12 index11 alt1"><code class="swift comments">//下面通过在局部参数名前加上#来简写外部参数名(此时局部参数名和外部参数名相同)</code></div>
<div class="line number13 index12 alt2"><code class="swift keyword">func</code> <code class="swift variable">split2</code><code class="swift plain">(#</code><code class="swift variable">string</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">,#</code><code class="swift variable">seperator</code><code class="swift plain">:</code><code class="swift color2">Character</code><code class="swift plain">)-</code><code class="swift plain">></code><code class="swift plain">[</code><code class="swift color2">String</code><code class="swift plain">]{</code></div>
<div class="line number14 index13 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift color2">split</code><code class="swift plain">(</code><code class="swift variable">string</code><code class="swift plain">, </code><code class="swift variable">maxSplit</code><code class="swift plain">: </code><code class="swift color2">Int</code><code class="swift plain">.</code><code class="swift color2">max</code><code class="swift plain">, </code><code class="swift variable">allowEmptySlices</code><code class="swift plain">: </code><code class="swift color2">false</code><code class="swift plain">, </code><code class="swift variable">isSeparator</code><code class="swift plain">: {$</code><code class="swift value">0</code><code class="swift plain">==</code><code class="swift variable">seperator</code><code class="swift plain">})</code></div>
<div class="line number15 index14 alt2"><code class="swift plain">}</code></div>
<div class="line number16 index15 alt1"><code class="swift variable">split2</code><code class="swift plain">(</code><code class="swift variable">string</code><code class="swift plain">: </code><code class="swift string">"hello,world,!"</code><code class="swift plain">, </code><code class="swift variable">seperator</code><code class="swift plain">: </code><code class="swift string">","</code><code class="swift plain">)</code></div>
<div class="line number17 index16 alt2"> </div>
<div class="line number18 index17 alt1"><code class="swift comments">//上面的split函数的最后一个参数默认设置为",",注意如果使用默认参数那么此参数名将默认作为外部参数名(此时局部参数名和外部参数名相同)</code></div>
<div class="line number19 index18 alt2"><code class="swift keyword">func</code> <code class="swift variable">split3</code><code class="swift plain">(#</code><code class="swift variable">string</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">,</code><code class="swift variable">seperator</code><code class="swift plain">:</code><code class="swift color2">Character</code><code class="swift plain">=</code><code class="swift string">","</code><code class="swift plain">)-</code><code class="swift plain">></code><code class="swift plain">[</code><code class="swift color2">String</code><code class="swift plain">]{</code></div>
<div class="line number20 index19 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift color2">split</code><code class="swift plain">(</code><code class="swift variable">string</code><code class="swift plain">, </code><code class="swift variable">maxSplit</code><code class="swift plain">: </code><code class="swift color2">Int</code><code class="swift plain">.</code><code class="swift color2">max</code><code class="swift plain">, </code><code class="swift variable">allowEmptySlices</code><code class="swift plain">: </code><code class="swift color2">false</code><code class="swift plain">, </code><code class="swift variable">isSeparator</code><code class="swift plain">: {$</code><code class="swift value">0</code><code class="swift plain">==</code><code class="swift variable">seperator</code><code class="swift plain">})</code></div>
<div class="line number21 index20 alt2"><code class="swift plain">}</code></div>
<div class="line number22 index21 alt1"><code class="swift variable">split3</code><code class="swift plain">(</code><code class="swift variable">string</code><code class="swift plain">: </code><code class="swift string">"hello,world,!"</code><code class="swift plain">, </code><code class="swift variable">seperator</code><code class="swift plain">: </code><code class="swift string">","</code><code class="swift plain">) </code><code class="swift comments">//结果:["hello", "world", "!"]</code></div>
<div class="line number23 index22 alt2"><code class="swift variable">split3</code><code class="swift plain">(</code><code class="swift variable">string</code><code class="swift plain">: </code><code class="swift string">"hello world !"</code><code class="swift plain">, </code><code class="swift variable">seperator</code><code class="swift plain">: </code><code class="swift string">" "</code><code class="swift plain">) </code><code class="swift comments">//结果:["hello", "world", "!"]</code></div>
<div class="line number24 index23 alt1"> </div>
<div class="line number25 index24 alt2"><code class="swift comments">//但是如果有默认值,又不想指定局部参数名可以使用“_”取消外部参数名</code></div>
<div class="line number26 index25 alt1"><code class="swift keyword">func</code> <code class="swift variable">split4</code><code class="swift plain">(</code><code class="swift variable">string</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">,</code><code class="swift value">_</code> <code class="swift variable">seperator</code><code class="swift plain">:</code><code class="swift color2">Character</code><code class="swift plain">=</code><code class="swift string">","</code><code class="swift plain">)-</code><code class="swift plain">></code><code class="swift plain">[</code><code class="swift color2">String</code><code class="swift plain">]{</code></div>
<div class="line number27 index26 alt2"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift color2">split</code><code class="swift plain">(</code><code class="swift variable">string</code><code class="swift plain">, </code><code class="swift variable">maxSplit</code><code class="swift plain">: </code><code class="swift color2">Int</code><code class="swift plain">.</code><code class="swift color2">max</code><code class="swift plain">, </code><code class="swift variable">allowEmptySlices</code><code class="swift plain">: </code><code class="swift color2">false</code><code class="swift plain">, </code><code class="swift variable">isSeparator</code><code class="swift plain">: {$</code><code class="swift value">0</code><code class="swift plain">==</code><code class="swift variable">seperator</code><code class="swift plain">})</code></div>
<div class="line number28 index27 alt1"><code class="swift plain">}</code></div>
<div class="line number29 index28 alt2"><code class="swift variable">split4</code><code class="swift plain">(</code><code class="swift string">"hello,world,!"</code><code class="swift plain">, </code><code class="swift string">","</code><code class="swift plain">) </code><code class="swift comments">//结果:["hello", "world", "!"]</code></div>
<div class="line number30 index29 alt1"> </div>
<div class="line number31 index30 alt2"><code class="swift plain">/**</code></div>
<div class="line number32 index31 alt1"><code class="swift spaces"> </code><code class="swift plain">* 可变参数,一个函数最多有一个可变参数并且作为最后一个参数</code></div>
<div class="line number33 index32 alt2"><code class="swift spaces"> </code><code class="swift plain">* 下面</code><code class="swift variable">strings</code><code class="swift plain">参数在内部是一个[</code><code class="swift color2">String</code><code class="swift plain">],对于外部是不定个数的</code><code class="swift color2">String</code><code class="swift plain">参数</code></div>
<div class="line number34 index33 alt1"><code class="swift spaces"> </code><code class="swift plain">*/</code></div>
<div class="line number35 index34 alt2"><code class="swift keyword">func</code> <code class="swift variable">joinStr</code><code class="swift plain">(</code><code class="swift variable">seperator</code><code class="swift plain">:</code><code class="swift color2">Character</code><code class="swift plain">=</code><code class="swift string">","</code><code class="swift plain">,</code><code class="swift variable">strings</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">...)-</code><code class="swift plain">></code><code class="swift color2">String</code><code class="swift plain">{</code></div>
<div class="line number36 index35 alt1"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">result</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">=</code><code class="swift string">""</code></div>
<div class="line number37 index36 alt2"><code class="swift spaces"> </code><code class="swift keyword">for</code> <code class="swift keyword">var</code> <code class="swift variable">i</code><code class="swift plain">=</code><code class="swift value">0</code><code class="swift plain">;</code><code class="swift variable">i</code><code class="swift plain"><</code><code class="swift variable">strings</code><code class="swift plain">.</code><code class="swift color2">count</code><code class="swift plain">;++</code><code class="swift variable">i</code><code class="swift plain">{</code></div>
<div class="line number38 index37 alt1"><code class="swift spaces"> </code><code class="swift keyword">if</code> <code class="swift variable">i</code> <code class="swift plain">!= </code><code class="swift value">0</code><code class="swift plain">{</code></div>
<div class="line number39 index38 alt2"><code class="swift spaces"> </code><code class="swift variable">result</code><code class="swift plain">.</code><code class="swift variable">append</code><code class="swift plain">(</code><code class="swift variable">seperator</code><code class="swift plain">)</code></div>
<div class="line number40 index39 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number41 index40 alt2"><code class="swift spaces"> </code><code class="swift variable">result</code><code class="swift plain">+=</code><code class="swift variable">strings</code><code class="swift plain">[</code><code class="swift variable">i</code><code class="swift plain">]</code></div>
<div class="line number42 index41 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number43 index42 alt2"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift variable">result</code></div>
<div class="line number44 index43 alt1"><code class="swift plain">}</code></div>
<div class="line number45 index44 alt2"> </div>
<div class="line number46 index45 alt1"><code class="swift variable">joinStr</code><code class="swift plain">(</code><code class="swift variable">seperator</code><code class="swift plain">:</code><code class="swift string">" "</code><code class="swift plain">, </code><code class="swift string">"hello"</code><code class="swift plain">,</code><code class="swift string">"world"</code><code class="swift plain">,</code><code class="swift string">"!"</code><code class="swift plain">) </code><code class="swift comments">//结果:"hello world !"</code></div>
<div class="line number47 index46 alt2"> </div>
<div class="line number48 index47 alt1"><code class="swift plain">/**</code></div>
<div class="line number49 index48 alt2"><code class="swift spaces"> </code><code class="swift plain">* 函数参数默认是常量,不能直接修改,通过声明</code><code class="swift keyword">var</code><code class="swift plain">可以将其转化为变量(但是注意</code><code class="swift color2">C</code><code class="swift plain">语言参数默认是变量)</code></div>
<div class="line number50 index49 alt1"><code class="swift spaces"> </code><code class="swift plain">* 但是注意这个变量对于外部是无效的,函数执行完就消失了</code></div>
<div class="line number51 index50 alt2"><code class="swift spaces"> </code><code class="swift plain">*/</code></div>
<div class="line number52 index51 alt1"><code class="swift keyword">func</code> <code class="swift variable">sum2</code><code class="swift plain">(</code><code class="swift keyword">var</code> <code class="swift variable">num1</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">,</code><code class="swift variable">num2</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">)-</code><code class="swift plain">></code><code class="swift color2">Int</code><code class="swift plain">{</code></div>
<div class="line number53 index52 alt2"><code class="swift spaces"> </code><code class="swift variable">num1</code> <code class="swift plain">= </code><code class="swift variable">num1</code> <code class="swift plain">+ </code><code class="swift variable">num2</code></div>
<div class="line number54 index53 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift variable">num1</code></div>
<div class="line number55 index54 alt2"><code class="swift plain">}</code></div>
<div class="line number56 index55 alt1"> </div>
<div class="line number57 index56 alt2"><code class="swift variable">sum2</code><code class="swift plain">(</code><code class="swift value">1</code><code class="swift plain">, </code><code class="swift value">2</code><code class="swift plain">) </code><code class="swift comments">//结果:3</code></div>
<div class="line number58 index57 alt1"> </div>
<div class="line number59 index58 alt2"><code class="swift plain">/**</code></div>
<div class="line number60 index59 alt1"><code class="swift spaces"> </code><code class="swift plain">* 输入输出参数</code></div>
<div class="line number61 index60 alt2"><code class="swift spaces"> </code><code class="swift plain">* 通过输入输出参数可以在函数内部修改函数外部的变量(注意调用时不能是常量或字面量)</code></div>
<div class="line number62 index61 alt1"><code class="swift spaces"> </code><code class="swift plain">* 注意:下面的</code><code class="swift color2">swap</code><code class="swift plain">仅仅为了演示,实际使用时请用</code><code class="swift variable">Swift</code><code class="swift plain">的全局函数</code><code class="swift color2">swap</code></div>
<div class="line number63 index62 alt2"><code class="swift spaces"> </code><code class="swift plain">*/</code></div>
<div class="line number64 index63 alt1"><code class="swift keyword">func</code> <code class="swift color2">swap</code><code class="swift plain">(</code><code class="swift keyword">inout</code> <code class="swift variable">a</code><code class="swift plain">:</code><code class="swift color2">Int</code> <code class="swift plain">,</code><code class="swift keyword">inout</code> <code class="swift variable">b</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">){</code></div>
<div class="line number65 index64 alt2"><code class="swift spaces"> </code><code class="swift variable">a</code><code class="swift plain">=</code><code class="swift variable">a</code><code class="swift plain">+</code><code class="swift variable">b</code></div>
<div class="line number66 index65 alt1"><code class="swift spaces"> </code><code class="swift variable">b</code><code class="swift plain">=</code><code class="swift variable">a</code><code class="swift plain">-</code><code class="swift variable">b</code></div>
<div class="line number67 index66 alt2"><code class="swift spaces"> </code><code class="swift variable">a</code><code class="swift plain">=</code><code class="swift variable">a</code><code class="swift plain">-</code><code class="swift variable">b</code></div>
<div class="line number68 index67 alt1"><code class="swift plain">}</code></div>
<div class="line number69 index68 alt2"> </div>
<div class="line number70 index69 alt1"><code class="swift keyword">var</code> <code class="swift variable">a</code><code class="swift plain">=</code><code class="swift value">1</code><code class="swift plain">,</code><code class="swift variable">b</code><code class="swift plain">=</code><code class="swift value">2</code></div>
<div class="line number71 index70 alt2"><code class="swift color2">swap</code><code class="swift plain">(</code><code class="swift plain">&</code><code class="swift variable">a</code><code class="swift plain">, </code><code class="swift plain">&</code><code class="swift variable">b</code><code class="swift plain">) </code><code class="swift comments">//调用时参数加上“&”符号</code></div>
<div class="line number72 index71 alt1"><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"a=\(</code><code class="swift variable">a</code><code class="swift string">),b=\(</code><code class="swift variable">b</code><code class="swift string">)"</code><code class="swift plain">) </code><code class="swift comments">//结果:"a=2,b=1"</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p> 和很多语言一样,Swift中的函数本身也可以看做一种类型,既可以作为参数又可以作为返回值。</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_129944" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift comments">/**</code></div>
<div class="line number2 index1 alt1"><code class="swift spaces"> </code><code class="swift comments">* 函数类型</code></div>
<div class="line number3 index2 alt2"><code class="swift spaces"> </code><code class="swift comments">*/</code></div>
<div class="line number4 index3 alt1"><code class="swift keyword">var</code> <code class="swift variable">sum3</code><code class="swift plain">=</code><code class="swift variable">sum</code> <code class="swift comments">//自动推断sum3的类型:(Int,Int)->Int,注意不同的函数类型之间不能直接赋值</code></div>
<div class="line number5 index4 alt2"><code class="swift variable">sum3</code><code class="swift plain">(</code><code class="swift value">1</code><code class="swift plain">,</code><code class="swift value">2</code><code class="swift plain">) </code><code class="swift comments">//结果:3</code></div>
<div class="line number6 index5 alt1"> </div>
<div class="line number7 index6 alt2"><code class="swift comments">//函数作为返回值</code></div>
<div class="line number8 index7 alt1"><code class="swift keyword">func</code> <code class="swift variable">fn</code><code class="swift plain">()-</code><code class="swift plain">></code><code class="swift plain">(</code><code class="swift color2">Int</code><code class="swift plain">,</code><code class="swift color2">Int</code><code class="swift plain">)-</code><code class="swift plain">></code><code class="swift color2">Int</code><code class="swift plain">{</code></div>
<div class="line number9 index8 alt2"><code class="swift spaces"> </code><code class="swift comments">//下面的函数是一个嵌套函数,作用于是在fn函数内部</code></div>
<div class="line number10 index9 alt1"><code class="swift spaces"> </code><code class="swift keyword">func</code> <code class="swift variable">minus</code><code class="swift plain">(</code><code class="swift variable">a</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">,</code><code class="swift variable">b</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">)-</code><code class="swift plain">></code><code class="swift color2">Int</code><code class="swift plain">{</code></div>
<div class="line number11 index10 alt2"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift variable">a</code><code class="swift plain">-</code><code class="swift variable">b</code></div>
<div class="line number12 index11 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number13 index12 alt2"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift variable">minus</code><code class="swift plain">;</code></div>
<div class="line number14 index13 alt1"><code class="swift plain">}</code></div>
<div class="line number15 index14 alt2"><code class="swift keyword">var</code> <code class="swift variable">minus</code><code class="swift plain">=</code><code class="swift variable">fn</code><code class="swift plain">()</code></div>
<div class="line number16 index15 alt1"> </div>
<div class="line number17 index16 alt2"><code class="swift comments">//函数作为参数</code></div>
<div class="line number18 index17 alt1"><code class="swift keyword">func</code> <code class="swift variable">caculate</code><code class="swift plain">(</code><code class="swift variable">num1</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">,</code><code class="swift variable">num2</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">,</code><code class="swift variable">fn</code><code class="swift plain">:(</code><code class="swift color2">Int</code><code class="swift plain">,</code><code class="swift color2">Int</code><code class="swift plain">)-</code><code class="swift plain">></code><code class="swift color2">Int</code><code class="swift plain">)-</code><code class="swift plain">></code><code class="swift color2">Int</code><code class="swift plain">{</code></div>
<div class="line number19 index18 alt2"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift variable">fn</code><code class="swift plain">(</code><code class="swift variable">num1</code><code class="swift plain">,</code><code class="swift variable">num2</code><code class="swift plain">)</code></div>
<div class="line number20 index19 alt1"><code class="swift plain">}</code></div>
<div class="line number21 index20 alt2"> </div>
<div class="line number22 index21 alt1"><code class="swift variable">caculate</code><code class="swift plain">(</code><code class="swift value">1</code><code class="swift plain">, </code><code class="swift value">2</code><code class="swift plain">, </code><code class="swift variable">sum</code><code class="swift plain">) </code><code class="swift comments">//结果:3</code></div>
<div class="line number23 index22 alt2"><code class="swift variable">caculate</code><code class="swift plain">(</code><code class="swift value">1</code><code class="swift plain">,</code><code class="swift value">2</code><code class="swift plain">, </code><code class="swift variable">minus</code><code class="swift plain">) </code><code class="swift comments">//结果:-1</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<h2 id="closures">闭包</h2>
<p>Swift中的闭包其实就是一个函数代码块,它和ObjC中的Block及C#、Java中的lambda是类似的。闭包的特点就是可以捕获和存储上下文中的常量或者变量的引用,即使这些常量或者变量在原作用域已经被销毁了在代码块中仍然可以使用。事实上前面的全局函数和嵌套函数也是一种闭包,对于全局函数它不会捕获任何常量或者变量,而对于嵌套函数则可以捕获其所在函数的常量或者变量。通常我们说的闭包更多的指的是闭包表达式,也就是没有函数名称的代码块,因此也称为匿名闭包。</p>
<p>在Swift中闭包表达式的定义形式如下:</p>
<p><strong>{ ( parameters ) -> returnType in</strong></p>
<p><strong> statements</strong></p>
<p><strong>}</strong></p>
<p>下面通过一个例子看一下如何通过闭包表达式来简化一个函数类型的参数,在下面的例子中闭包的形式也是一而再再而三的被简化,充分说明了Swift语法的简洁性:</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_551212" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift keyword">func</code> <code class="swift variable">sum</code><code class="swift plain">(</code><code class="swift variable">num1</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">,</code><code class="swift variable">num2</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">)-</code><code class="swift plain">></code><code class="swift color2">Int</code><code class="swift plain">{</code></div>
<div class="line number2 index1 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift variable">num1</code> <code class="swift plain">+ </code><code class="swift variable">num2</code></div>
<div class="line number3 index2 alt2"><code class="swift plain">}</code></div>
<div class="line number4 index3 alt1"> </div>
<div class="line number5 index4 alt2"><code class="swift keyword">func</code> <code class="swift variable">minus</code><code class="swift plain">(</code><code class="swift variable">num1</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">,</code><code class="swift variable">num2</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">)-</code><code class="swift plain">></code><code class="swift color2">Int</code><code class="swift plain">{</code></div>
<div class="line number6 index5 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift variable">num1</code> <code class="swift plain">- </code><code class="swift variable">num2</code></div>
<div class="line number7 index6 alt2"><code class="swift plain">}</code></div>
<div class="line number8 index7 alt1"> </div>
<div class="line number9 index8 alt2"><code class="swift keyword">func</code> <code class="swift variable">caculate</code><code class="swift plain">(</code><code class="swift variable">num1</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">,</code><code class="swift variable">num2</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">,</code><code class="swift variable">fn</code><code class="swift plain">:(</code><code class="swift color2">Int</code><code class="swift plain">,</code><code class="swift color2">Int</code><code class="swift plain">)-</code><code class="swift plain">></code><code class="swift color2">Int</code><code class="swift plain">)-</code><code class="swift plain">></code><code class="swift color2">Int</code><code class="swift plain">{</code></div>
<div class="line number10 index9 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift variable">fn</code><code class="swift plain">(</code><code class="swift variable">num1</code><code class="swift plain">,</code><code class="swift variable">num2</code><code class="swift plain">)</code></div>
<div class="line number11 index10 alt2"><code class="swift plain">}</code></div>
<div class="line number12 index11 alt1"> </div>
<div class="line number13 index12 alt2"><code class="swift keyword">var</code> <code class="swift plain">(</code><code class="swift variable">a</code><code class="swift plain">,</code><code class="swift variable">b</code><code class="swift plain">)=(</code><code class="swift value">1</code><code class="swift plain">,</code><code class="swift value">2</code><code class="swift plain">)</code></div>
<div class="line number14 index13 alt1"> </div>
<div class="line number15 index14 alt2"><code class="swift variable">caculate</code><code class="swift plain">(</code><code class="swift variable">a</code><code class="swift plain">, </code><code class="swift variable">b</code><code class="swift plain">, </code><code class="swift variable">sum</code><code class="swift plain">) </code><code class="swift comments">//结果:3</code></div>
<div class="line number16 index15 alt1"><code class="swift variable">caculate</code><code class="swift plain">(</code><code class="swift variable">a</code><code class="swift plain">, </code><code class="swift variable">b</code><code class="swift plain">, </code><code class="swift variable">minus</code><code class="swift plain">) </code><code class="swift comments">//结果:-1</code></div>
<div class="line number17 index16 alt2"> </div>
<div class="line number18 index17 alt1"><code class="swift comments">//利用闭包表达式简化闭包函数</code></div>
<div class="line number19 index18 alt2"><code class="swift variable">caculate</code><code class="swift plain">(</code><code class="swift variable">a</code><code class="swift plain">, </code><code class="swift variable">b</code><code class="swift plain">, {(</code><code class="swift variable">num1</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">,</code><code class="swift variable">num2</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">)-</code><code class="swift plain">></code><code class="swift color2">Int</code> <code class="swift keyword">in</code></div>
<div class="line number20 index19 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift variable">num1</code> <code class="swift plain">- </code><code class="swift variable">num2</code></div>
<div class="line number21 index20 alt2"><code class="swift plain">}) </code><code class="swift comments">//结果:-1</code></div>
<div class="line number22 index21 alt1"> </div>
<div class="line number23 index22 alt2"><code class="swift comments">//简化形式,根据上下文推断类型并且对于单表达式闭包(只有一个语句)可以隐藏return关键字</code></div>
<div class="line number24 index23 alt1"><code class="swift variable">caculate</code><code class="swift plain">(</code><code class="swift variable">a</code><code class="swift plain">, </code><code class="swift variable">b</code><code class="swift plain">, { </code><code class="swift variable">num1</code><code class="swift plain">,</code><code class="swift variable">num2</code> <code class="swift keyword">in</code></div>
<div class="line number25 index24 alt2"><code class="swift spaces"> </code><code class="swift variable">num1</code> <code class="swift plain">- </code><code class="swift variable">num2</code></div>
<div class="line number26 index25 alt1"><code class="swift plain">}) </code><code class="swift comments">//结果:-1</code></div>
<div class="line number27 index26 alt2"> </div>
<div class="line number28 index27 alt1"><code class="swift comments">//再次简化,使用参数名缩写,使用$0...$n代表第n个参数,并且此in关键字也省略了</code></div>
<div class="line number29 index28 alt2"><code class="swift variable">caculate</code><code class="swift plain">(</code><code class="swift variable">a</code><code class="swift plain">, </code><code class="swift variable">b</code><code class="swift plain">, {</code></div>
<div class="line number30 index29 alt1"><code class="swift spaces"> </code><code class="swift plain">$</code><code class="swift value">0</code> <code class="swift plain">- $</code><code class="swift value">1</code></div>
<div class="line number31 index30 alt2"><code class="swift plain">}) </code><code class="swift comments">//结果:-1</code></div>
</div>
</td>
</tr>
</tbody>
</table>
<p>考虑到闭包表达式的可读取性,Swift中如果一个函数的最后一个参数是一个函数类型的参数(或者说是闭包表达式),则可以将此参数写在函数括号之后,这种闭包称之为“尾随闭包”。</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_984924" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift keyword">func</code> <code class="swift variable">sum</code><code class="swift plain">(</code><code class="swift variable">num1</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">,</code><code class="swift variable">num2</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">)-</code><code class="swift plain">></code><code class="swift color2">Int</code><code class="swift plain">{</code></div>
<div class="line number2 index1 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift variable">num1</code> <code class="swift plain">+ </code><code class="swift variable">num2</code></div>
<div class="line number3 index2 alt2"><code class="swift plain">}</code></div>
<div class="line number4 index3 alt1"> </div>
<div class="line number5 index4 alt2"><code class="swift keyword">func</code> <code class="swift variable">minus</code><code class="swift plain">(</code><code class="swift variable">num1</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">,</code><code class="swift variable">num2</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">)-</code><code class="swift plain">></code><code class="swift color2">Int</code><code class="swift plain">{</code></div>
<div class="line number6 index5 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift variable">num1</code><code class="swift plain">-</code><code class="swift variable">num2</code></div>
<div class="line number7 index6 alt2"><code class="swift plain">}</code></div>
<div class="line number8 index7 alt1"> </div>
<div class="line number9 index8 alt2"><code class="swift keyword">func</code> <code class="swift variable">caculate</code><code class="swift plain">(</code><code class="swift variable">num1</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">,</code><code class="swift variable">num2</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">,</code><code class="swift variable">fn</code><code class="swift plain">:(</code><code class="swift color2">Int</code><code class="swift plain">,</code><code class="swift color2">Int</code><code class="swift plain">)-</code><code class="swift plain">></code><code class="swift color2">Int</code><code class="swift plain">)-</code><code class="swift plain">></code><code class="swift color2">Int</code><code class="swift plain">{</code></div>
<div class="line number10 index9 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift variable">fn</code><code class="swift plain">(</code><code class="swift variable">num1</code><code class="swift plain">,</code><code class="swift variable">num2</code><code class="swift plain">)</code></div>
<div class="line number11 index10 alt2"><code class="swift plain">}</code></div>
<div class="line number12 index11 alt1"> </div>
<div class="line number13 index12 alt2"><code class="swift keyword">var</code> <code class="swift plain">(</code><code class="swift variable">a</code><code class="swift plain">,</code><code class="swift variable">b</code><code class="swift plain">)=(</code><code class="swift value">1</code><code class="swift plain">,</code><code class="swift value">2</code><code class="swift plain">)</code></div>
<div class="line number14 index13 alt1"> </div>
<div class="line number15 index14 alt2"><code class="swift comments">//尾随闭包,最后一个参数是闭包表达式时可以卸载括号之后,同时注意如果这个函数只有一个闭包表达式参数时可以连通括号一块省略</code></div>
<div class="line number16 index15 alt1"><code class="swift comments">//请注意和函数定义进行区分</code></div>
<div class="line number17 index16 alt2"><code class="swift variable">caculate</code><code class="swift plain">(</code><code class="swift variable">a</code><code class="swift plain">, </code><code class="swift variable">b</code><code class="swift plain">){</code></div>
<div class="line number18 index17 alt1"><code class="swift spaces"> </code><code class="swift plain">$</code><code class="swift value">0</code> <code class="swift plain">- $</code><code class="swift value">1</code></div>
<div class="line number19 index18 alt2"><code class="swift plain">} </code><code class="swift comments">//结果:-1</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>前面说过闭包之所以称之为“闭包”就是因为其可以捕获一定作用域内的常量或者变量进而闭合并包裹着。</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_907229" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift keyword">func</code> <code class="swift variable">add</code><code class="swift plain">()-</code><code class="swift plain">></code><code class="swift plain">()-</code><code class="swift plain">></code><code class="swift color2">Int</code><code class="swift plain">{</code></div>
<div class="line number2 index1 alt1"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">total</code><code class="swift plain">=</code><code class="swift value">0</code></div>
<div class="line number3 index2 alt2"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">step</code><code class="swift plain">=</code><code class="swift value">1</code></div>
<div class="line number4 index3 alt1"><code class="swift spaces"> </code><code class="swift keyword">func</code> <code class="swift variable">fn</code><code class="swift plain">()-</code><code class="swift plain">></code><code class="swift color2">Int</code><code class="swift plain">{</code></div>
<div class="line number5 index4 alt2"><code class="swift spaces"> </code><code class="swift variable">total</code><code class="swift plain">+=</code><code class="swift variable">step</code></div>
<div class="line number6 index5 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift variable">total</code></div>
<div class="line number7 index6 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number8 index7 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift variable">fn</code></div>
<div class="line number9 index8 alt2"><code class="swift plain">}</code></div>
<div class="line number10 index9 alt1"> </div>
<div class="line number11 index10 alt2"><code class="swift comments">//fn捕获了total和step,尽管下面的add()执行完后total和step被释放,但是由于fn捕获了二者的副本,所以fn会随着两个变量的副本一起被存储</code></div>
<div class="line number12 index11 alt1"><code class="swift keyword">var</code> <code class="swift variable">a</code><code class="swift plain">=</code><code class="swift variable">add</code><code class="swift plain">()</code></div>
<div class="line number13 index12 alt2"><code class="swift variable">a</code><code class="swift plain">() </code><code class="swift comments">//结果:1</code></div>
<div class="line number14 index13 alt1"><code class="swift variable">a</code><code class="swift plain">() </code><code class="swift comments">//结果:2,说明a中保存了total的副本(否则结果会是1)</code></div>
<div class="line number15 index14 alt2"> </div>
<div class="line number16 index15 alt1"><code class="swift keyword">var</code> <code class="swift variable">b</code><code class="swift plain">=</code><code class="swift variable">add</code><code class="swift plain">()</code></div>
<div class="line number17 index16 alt2"><code class="swift variable">b</code><code class="swift plain">() </code><code class="swift comments">//结果:1 ,说明a和b单独保存了total的副本(否则结果会是3)</code></div>
<div class="line number18 index17 alt1"> </div>
<div class="line number19 index18 alt2"><code class="swift keyword">var</code> <code class="swift color2">c</code><code class="swift plain">=</code><code class="swift variable">b</code></div>
<div class="line number20 index19 alt1"><code class="swift color2">c</code><code class="swift plain">() </code><code class="swift comments">//结果:2,说明闭包是引用类型,换句话说函数是引用类型(否则结果会是1)</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>Swift会自动决定捕获变量或者常量副本的拷贝类型(值拷贝或者引用拷贝)而不需要开发者关心,另外被捕获的变量或者常量的内存管理同样是由Swift来管理,例如当上面的函数a不再使用了那么fn捕获的两个变量也就释放了。</p>
<h1 id="class">类</h1>
<p>作为一门面向对象语言,类当然是Swift中的一等类型。首先通过下面的例子让大家对Swift的class有一个简单的印象,在下面的例子中可以看到Swift中的属性、方法(包括构造方法和析构方法):</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_293176" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift comments">//Swift中一个类可以不继承于任何其他基类,那么此类本身就是一个基类</code></div>
<div class="line number2 index1 alt1"><code class="swift keyword">class</code> <code class="swift variable">Person</code> <code class="swift plain">{</code></div>
<div class="line number3 index2 alt2"><code class="swift spaces"> </code><code class="swift comments">//定义属性</code></div>
<div class="line number4 index3 alt1"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">name</code><code class="swift plain">:</code><code class="swift color2">String</code></div>
<div class="line number5 index4 alt2"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">height</code><code class="swift plain">=</code><code class="swift value">0.0</code></div>
<div class="line number6 index5 alt1"><code class="swift spaces"> </code> </div>
<div class="line number7 index6 alt2"><code class="swift spaces"> </code><code class="swift comments">//构造器方法,注意如果不编写构造方法默认会自动创建一个无参构造方法</code></div>
<div class="line number8 index7 alt1"><code class="swift spaces"> </code><code class="swift keyword">init</code><code class="swift plain">(</code><code class="swift variable">name</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">){</code></div>
<div class="line number9 index8 alt2"><code class="swift spaces"> </code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">name</code><code class="swift plain">=</code><code class="swift variable">name</code></div>
<div class="line number10 index9 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number11 index10 alt2"><code class="swift spaces"> </code> </div>
<div class="line number12 index11 alt1"><code class="swift spaces"> </code><code class="swift comments">//定义方法</code></div>
<div class="line number13 index12 alt2"><code class="swift spaces"> </code><code class="swift keyword">func</code> <code class="swift variable">showMessage</code><code class="swift plain">(){</code></div>
<div class="line number14 index13 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"name=\(</code><code class="swift variable">name</code><code class="swift string">),height=\(</code><code class="swift variable">height</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number15 index14 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number16 index15 alt1"><code class="swift spaces"> </code> </div>
<div class="line number17 index16 alt2"><code class="swift spaces"> </code><code class="swift comments">//析构方法,在对象被释放时调用,类似于ObjC的dealloc,注意此函数没有括号,没有参数,无法直接调用</code></div>
<div class="line number18 index17 alt1"><code class="swift spaces"> </code><code class="swift keyword">deinit</code><code class="swift plain">{</code></div>
<div class="line number19 index18 alt2"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"deinit..."</code><code class="swift plain">)</code></div>
<div class="line number20 index19 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number21 index20 alt2"><code class="swift spaces"> </code> </div>
<div class="line number22 index21 alt1"><code class="swift plain">}</code></div>
<div class="line number23 index22 alt2"> </div>
<div class="line number24 index23 alt1"> </div>
<div class="line number25 index24 alt2"><code class="swift keyword">var</code> <code class="swift variable">p</code><code class="swift plain">=</code><code class="swift variable">Person</code><code class="swift plain">(</code><code class="swift variable">name</code><code class="swift plain">: </code><code class="swift string">"Kenhin"</code><code class="swift plain">)</code></div>
<div class="line number26 index25 alt1"><code class="swift variable">p</code><code class="swift plain">.</code><code class="swift variable">height</code><code class="swift plain">=</code><code class="swift value">172.0</code></div>
<div class="line number27 index26 alt2"><code class="swift variable">p</code><code class="swift plain">.</code><code class="swift variable">showMessage</code><code class="swift plain">() </code><code class="swift comments">//结果:name=Kenhin,height=172.0</code></div>
<div class="line number28 index27 alt1"> </div>
<div class="line number29 index28 alt2"><code class="swift comments">//类是引用类型</code></div>
<div class="line number30 index29 alt1"><code class="swift keyword">var</code> <code class="swift variable">p2</code> <code class="swift plain">= </code><code class="swift variable">p</code></div>
<div class="line number31 index30 alt2"><code class="swift variable">p2</code><code class="swift plain">.</code><code class="swift variable">name</code> <code class="swift plain">= </code><code class="swift string">"Kaoru"</code></div>
<div class="line number32 index31 alt1"><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift variable">p</code><code class="swift plain">.</code><code class="swift variable">name</code><code class="swift plain">) </code><code class="swift comments">//结果:Kaoru</code></div>
<div class="line number33 index32 alt2"><code class="swift keyword">if</code> <code class="swift variable">p</code> <code class="swift plain">=== </code><code class="swift variable">p2</code> <code class="swift plain">{ </code><code class="swift comments">//“===”表示等价于,这里不能使用等于“==”(等于用于比较值相等,p和p2是不同的值,只是指向的对象相同)</code></div>
<div class="line number34 index33 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"p===p2"</code><code class="swift plain">) </code><code class="swift comments">//p等价于p2,二者指向同一个对象</code></div>
<div class="line number35 index34 alt2"><code class="swift plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p> 从上面的例子不难看出:</p>
<ol>
<li>Swift中的类不必须继承一个基类(但是ObjC通常必须继承于NSObject),如果一个类没有继承于任何其他类则这个类也称为“基类”;</li>
<li>Swift中的属性定义形式类似于其他语句中的成员变量(或称之为“实例变量”),尽管它有着成员变量没有的特性;</li>
<li>Swift中如果开发者没有自己编写构造方法那么默认会提供一个无参数构造方法(否则不会自动生成构造方法);</li>
<li>Swift中的析构方法没有括号和参数,并且不支持自行调用;</li>
</ol>
<h2 id="property">属性</h2>
<p>Swift中的属性分为两种:存储属性(用于类、结构体)和计算属性(用于类、结构体、枚举),并且在Swift中并不强调成员变量的概念。 无论从概念上还是定义方式上来看存储属性更像其他语言中的成员变量,但是不同的是可以控制读写操作、通过属性监视器来属性的变化以及快速实现懒加载功能。 </p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_254529" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
<div class="line number38 index37 alt1">38</div>
<div class="line number39 index38 alt2">39</div>
<div class="line number40 index39 alt1">40</div>
<div class="line number41 index40 alt2">41</div>
<div class="line number42 index41 alt1">42</div>
<div class="line number43 index42 alt2">43</div>
<div class="line number44 index43 alt1">44</div>
<div class="line number45 index44 alt2">45</div>
<div class="line number46 index45 alt1">46</div>
<div class="line number47 index46 alt2">47</div>
<div class="line number48 index47 alt1">48</div>
<div class="line number49 index48 alt2">49</div>
<div class="line number50 index49 alt1">50</div>
<div class="line number51 index50 alt2">51</div>
<div class="line number52 index51 alt1">52</div>
<div class="line number53 index52 alt2">53</div>
<div class="line number54 index53 alt1">54</div>
<div class="line number55 index54 alt2">55</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift keyword">class</code> <code class="swift variable">Account</code> <code class="swift plain">{</code></div>
<div class="line number2 index1 alt1"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">balance</code><code class="swift plain">:</code><code class="swift color2">Double</code><code class="swift plain">=</code><code class="swift value">0.0</code></div>
<div class="line number3 index2 alt2"><code class="swift plain">}</code></div>
<div class="line number4 index3 alt1"> </div>
<div class="line number5 index4 alt2"><code class="swift keyword">class</code> <code class="swift variable">Person</code> <code class="swift plain">{</code></div>
<div class="line number6 index5 alt1"><code class="swift spaces"> </code><code class="swift comments">//firstName、lastName、age是存储属性</code></div>
<div class="line number7 index6 alt2"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">firstName</code><code class="swift plain">:</code><code class="swift color2">String</code></div>
<div class="line number8 index7 alt1"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">lastName</code><code class="swift plain">:</code><code class="swift color2">String</code></div>
<div class="line number9 index8 alt2"><code class="swift spaces"> </code> </div>
<div class="line number10 index9 alt1"><code class="swift spaces"> </code><code class="swift keyword">let</code> <code class="swift variable">age</code><code class="swift plain">:</code><code class="swift color2">Int</code></div>
<div class="line number11 index10 alt2"><code class="swift spaces"> </code> </div>
<div class="line number12 index11 alt1"><code class="swift spaces"> </code><code class="swift comments">//fullName是一个计算属性,并且由于只定义了get方法,所以是一个只读属性</code></div>
<div class="line number13 index12 alt2"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">fullName</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">{</code></div>
<div class="line number14 index13 alt1"><code class="swift spaces"> </code><code class="swift keyword">get</code><code class="swift plain">{</code></div>
<div class="line number15 index14 alt2"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift variable">firstName</code> <code class="swift plain">+ </code><code class="swift string">"."</code> <code class="swift plain">+ </code><code class="swift variable">lastName</code></div>
<div class="line number16 index15 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number17 index16 alt2"><code class="swift spaces"> </code><code class="swift keyword">set</code><code class="swift plain">{</code></div>
<div class="line number18 index17 alt1"><code class="swift spaces"> </code><code class="swift keyword">let</code> <code class="swift variable">array</code><code class="swift plain">=</code><code class="swift color2">split</code><code class="swift plain">(</code><code class="swift variable">newValue</code><code class="swift plain">, </code><code class="swift variable">maxSplit</code><code class="swift plain">: </code><code class="swift color2">Int</code><code class="swift plain">.</code><code class="swift color2">max</code><code class="swift plain">, </code><code class="swift variable">allowEmptySlices</code><code class="swift plain">: </code><code class="swift color2">false</code><code class="swift plain">, </code><code class="swift variable">isSeparator</code><code class="swift plain">: {$</code><code class="swift value">0</code><code class="swift plain">==</code><code class="swift string">"."</code><code class="swift plain">})</code></div>
<div class="line number19 index18 alt2"><code class="swift spaces"> </code><code class="swift keyword">if</code> <code class="swift variable">array</code><code class="swift plain">.</code><code class="swift color2">count</code> <code class="swift plain">== </code><code class="swift value">2</code> <code class="swift plain">{</code></div>
<div class="line number20 index19 alt1"><code class="swift spaces"> </code><code class="swift variable">firstName</code><code class="swift plain">=</code><code class="swift variable">array</code><code class="swift plain">[</code><code class="swift value">0</code><code class="swift plain">]</code></div>
<div class="line number21 index20 alt2"><code class="swift spaces"> </code><code class="swift variable">lastName</code><code class="swift plain">=</code><code class="swift variable">array</code><code class="swift plain">[</code><code class="swift value">1</code><code class="swift plain">]</code></div>
<div class="line number22 index21 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number23 index22 alt2"><code class="swift spaces"> </code> </div>
<div class="line number24 index23 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number25 index24 alt2"><code class="swift spaces"> </code><code class="swift comments">//set方法中的newValue表示即将赋的新值,可以自己设置set中的newValue变量,如下:</code></div>
<div class="line number26 index25 alt1"><code class="swift comments">// set(myValue){</code></div>
<div class="line number27 index26 alt2"><code class="swift comments">// }</code></div>
<div class="line number28 index27 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number29 index28 alt2"><code class="swift spaces"> </code><code class="swift comments">//如果fullName只有get则是一个只读属性,只读属性可以简写如下:</code></div>
<div class="line number30 index29 alt1"><code class="swift comments">// var fullName:String{</code></div>
<div class="line number31 index30 alt2"><code class="swift comments">// return firstName + "." + lastName</code></div>
<div class="line number32 index31 alt1"><code class="swift comments">// }</code></div>
<div class="line number33 index32 alt2"><code class="swift spaces"> </code> </div>
<div class="line number34 index33 alt1"><code class="swift spaces"> </code><code class="swift comments">//属性的懒加载,第一次访问才会计算初始值,在Swift中懒加载的属性不一定就是对象类型,也可以是基本类型</code></div>
<div class="line number35 index34 alt2"><code class="swift spaces"> </code><code class="swift variable">lazy</code> <code class="swift keyword">var</code> <code class="swift variable">account</code> <code class="swift plain">= </code><code class="swift variable">Account</code><code class="swift plain">()</code></div>
<div class="line number36 index35 alt1"><code class="swift spaces"> </code> </div>
<div class="line number37 index36 alt2"><code class="swift spaces"> </code> </div>
<div class="line number38 index37 alt1"><code class="swift spaces"> </code><code class="swift comments">//构造器方法,注意如果不编写构造方法默认会自动创建一个无参构造方法</code></div>
<div class="line number39 index38 alt2"><code class="swift spaces"> </code><code class="swift keyword">init</code><code class="swift plain">(</code><code class="swift variable">firstName</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">,</code><code class="swift variable">lastName</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">,</code><code class="swift variable">age</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">){</code></div>
<div class="line number40 index39 alt1"><code class="swift spaces"> </code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">firstName</code><code class="swift plain">=</code><code class="swift variable">firstName</code></div>
<div class="line number41 index40 alt2"><code class="swift spaces"> </code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">lastName</code><code class="swift plain">=</code><code class="swift variable">lastName</code></div>
<div class="line number42 index41 alt1"><code class="swift spaces"> </code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">age</code><code class="swift plain">=</code><code class="swift variable">age</code></div>
<div class="line number43 index42 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number44 index43 alt1"><code class="swift spaces"> </code> </div>
<div class="line number45 index44 alt2"><code class="swift spaces"> </code><code class="swift comments">//定义方法</code></div>
<div class="line number46 index45 alt1"><code class="swift spaces"> </code><code class="swift keyword">func</code> <code class="swift variable">showMessage</code><code class="swift plain">(){</code></div>
<div class="line number47 index46 alt2"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"name=\(</code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">fullName</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number48 index47 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number49 index48 alt2"><code class="swift plain">}</code></div>
<div class="line number50 index49 alt1"> </div>
<div class="line number51 index50 alt2"> </div>
<div class="line number52 index51 alt1"><code class="swift keyword">var</code> <code class="swift variable">p</code><code class="swift plain">=</code><code class="swift variable">Person</code><code class="swift plain">(</code><code class="swift variable">firstName</code><code class="swift plain">: </code><code class="swift string">"Kenshin"</code><code class="swift plain">, </code><code class="swift variable">lastName</code><code class="swift plain">: </code><code class="swift string">"Cui"</code><code class="swift plain">,</code><code class="swift variable">age</code><code class="swift plain">:</code><code class="swift value">29</code><code class="swift plain">)</code></div>
<div class="line number53 index52 alt2"><code class="swift variable">p</code><code class="swift plain">.</code><code class="swift variable">fullName</code><code class="swift plain">=</code><code class="swift string">"Kaoru.Sun"</code></div>
<div class="line number54 index53 alt1"><code class="swift variable">p</code><code class="swift plain">.</code><code class="swift variable">account</code><code class="swift plain">.</code><code class="swift variable">balance</code><code class="swift plain">=</code><code class="swift value">10</code></div>
<div class="line number55 index54 alt2"><code class="swift variable">p</code><code class="swift plain">.</code><code class="swift variable">showMessage</code><code class="swift plain">()</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p> 需要提醒大家的是:</p>
<ol>
<li>计算属性并不直接存储一个值,而是提供getter来获取一个值,或者利用setter来间接设置其他属性;</li>
<li> lazy属性必须有初始值,必须是变量不能是常量(因为常量在构造完成之前就已经确定了值);</li>
<li>在构造方法之前存储属性必须有值,无论是变量属性(var修饰)还是常量属性(let修饰)这个值既可以在属性创建时指定也可以在构造方法内指定;</li>
</ol>
<p>从上面的例子中不难区分存储属性和计算属性,计算属性通常会有一个setter、getter方法,如果要监视一个计算属性的变化在setter方法中即可办到(因为在setter方法中可以newValue或者自定义参数名),但是如果是存储属性就无法通过监视属性的变化过程了,因为在存储属性中是无法定义setter方法的。不过Swift为我们提供了另外两个方法来监视属性的变化那就是willSet和didSet,通常称之为“属性监视器”或“属性观察器”。</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_918025" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
<div class="line number38 index37 alt1">38</div>
<div class="line number39 index38 alt2">39</div>
<div class="line number40 index39 alt1">40</div>
<div class="line number41 index40 alt2">41</div>
<div class="line number42 index41 alt1">42</div>
<div class="line number43 index42 alt2">43</div>
<div class="line number44 index43 alt1">44</div>
<div class="line number45 index44 alt2">45</div>
<div class="line number46 index45 alt1">46</div>
<div class="line number47 index46 alt2">47</div>
<div class="line number48 index47 alt1">48</div>
<div class="line number49 index48 alt2">49</div>
<div class="line number50 index49 alt1">50</div>
<div class="line number51 index50 alt2">51</div>
<div class="line number52 index51 alt1">52</div>
<div class="line number53 index52 alt2">53</div>
<div class="line number54 index53 alt1">54</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift keyword">class</code> <code class="swift variable">Account</code> <code class="swift plain">{</code></div>
<div class="line number2 index1 alt1"><code class="swift spaces"> </code><code class="swift comments">//注意设置默认值0.0时监视器不会被调用</code></div>
<div class="line number3 index2 alt2"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">balance</code><code class="swift plain">:</code><code class="swift color2">Double</code><code class="swift plain">=</code><code class="swift value">0.0</code><code class="swift plain">{</code></div>
<div class="line number4 index3 alt1"><code class="swift spaces"> </code><code class="swift keyword">willSet</code><code class="swift plain">{</code></div>
<div class="line number5 index4 alt2"><code class="swift spaces"> </code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">balance</code><code class="swift plain">=</code><code class="swift value">2.0</code></div>
<div class="line number6 index5 alt1"><code class="swift spaces"> </code><code class="swift comments">//注意newValue可以使用自定义值,并且在属性监视器内部调用属性不会引起监视器循环调用,注意此时修改balance的值没有用</code></div>
<div class="line number7 index6 alt2"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"Account.balance willSet,newValue=\(</code><code class="swift variable">newValue</code><code class="swift string">),value=\(</code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">balance</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number8 index7 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number9 index8 alt2"><code class="swift spaces"> </code><code class="swift keyword">didSet</code><code class="swift plain">{</code></div>
<div class="line number10 index9 alt1"><code class="swift spaces"> </code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">balance</code><code class="swift plain">=</code><code class="swift value">3.0</code></div>
<div class="line number11 index10 alt2"><code class="swift spaces"> </code><code class="swift comments">//注意oldValue可以使用自定义值,并且在属性监视器内部调用属性不会引起监视器循环调用,注意此时修改balance的值将作为最终结果</code></div>
<div class="line number12 index11 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"Account.balance didSet,oldValue=\(</code><code class="swift variable">oldValue</code><code class="swift string">),value=\(</code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">balance</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number13 index12 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number14 index13 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number15 index14 alt2"><code class="swift plain">}</code></div>
<div class="line number16 index15 alt1"> </div>
<div class="line number17 index16 alt2"><code class="swift keyword">class</code> <code class="swift variable">Person</code> <code class="swift plain">{</code></div>
<div class="line number18 index17 alt1"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">firstName</code><code class="swift plain">:</code><code class="swift color2">String</code></div>
<div class="line number19 index18 alt2"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">lastName</code><code class="swift plain">:</code><code class="swift color2">String</code></div>
<div class="line number20 index19 alt1"><code class="swift spaces"> </code><code class="swift keyword">let</code> <code class="swift variable">age</code><code class="swift plain">:</code><code class="swift color2">Int</code></div>
<div class="line number21 index20 alt2"><code class="swift spaces"> </code> </div>
<div class="line number22 index21 alt1"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">fullName</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">{</code></div>
<div class="line number23 index22 alt2"><code class="swift spaces"> </code><code class="swift keyword">get</code><code class="swift plain">{</code></div>
<div class="line number24 index23 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift variable">firstName</code> <code class="swift plain">+ </code><code class="swift string">"."</code> <code class="swift plain">+ </code><code class="swift variable">lastName</code></div>
<div class="line number25 index24 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number26 index25 alt1"><code class="swift spaces"> </code><code class="swift keyword">set</code><code class="swift plain">{</code></div>
<div class="line number27 index26 alt2"><code class="swift spaces"> </code><code class="swift comments">//对于计算属性可以直接在set方法中进行属性监视</code></div>
<div class="line number28 index27 alt1"><code class="swift spaces"> </code><code class="swift keyword">let</code> <code class="swift variable">array</code><code class="swift plain">=</code><code class="swift color2">split</code><code class="swift plain">(</code><code class="swift variable">newValue</code><code class="swift plain">, </code><code class="swift variable">maxSplit</code><code class="swift plain">: </code><code class="swift color2">Int</code><code class="swift plain">.</code><code class="swift color2">max</code><code class="swift plain">, </code><code class="swift variable">allowEmptySlices</code><code class="swift plain">: </code><code class="swift color2">false</code><code class="swift plain">, </code><code class="swift variable">isSeparator</code><code class="swift plain">: { $</code><code class="swift value">0</code> <code class="swift plain">== </code><code class="swift string">"."</code> <code class="swift plain">})</code></div>
<div class="line number29 index28 alt2"><code class="swift spaces"> </code><code class="swift keyword">if</code> <code class="swift variable">array</code><code class="swift plain">.</code><code class="swift color2">count</code> <code class="swift plain">== </code><code class="swift value">2</code> <code class="swift plain">{</code></div>
<div class="line number30 index29 alt1"><code class="swift spaces"> </code><code class="swift variable">firstName</code><code class="swift plain">=</code><code class="swift variable">array</code><code class="swift plain">[</code><code class="swift value">0</code><code class="swift plain">]</code></div>
<div class="line number31 index30 alt2"><code class="swift spaces"> </code><code class="swift variable">lastName</code><code class="swift plain">=</code><code class="swift variable">array</code><code class="swift plain">[</code><code class="swift value">1</code><code class="swift plain">]</code></div>
<div class="line number32 index31 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number33 index32 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number34 index33 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number35 index34 alt2"><code class="swift spaces"> </code><code class="swift variable">lazy</code> <code class="swift keyword">var</code> <code class="swift variable">account</code> <code class="swift plain">= </code><code class="swift variable">Account</code><code class="swift plain">()</code></div>
<div class="line number36 index35 alt1"><code class="swift spaces"> </code><code class="swift keyword">init</code><code class="swift plain">(</code><code class="swift variable">firstName</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">,</code><code class="swift variable">lastName</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">,</code><code class="swift variable">age</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">){</code></div>
<div class="line number37 index36 alt2"><code class="swift spaces"> </code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">firstName</code><code class="swift plain">=</code><code class="swift variable">firstName</code></div>
<div class="line number38 index37 alt1"><code class="swift spaces"> </code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">lastName</code><code class="swift plain">=</code><code class="swift variable">lastName</code></div>
<div class="line number39 index38 alt2"><code class="swift spaces"> </code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">age</code><code class="swift plain">=</code><code class="swift variable">age</code></div>
<div class="line number40 index39 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number41 index40 alt2"><code class="swift spaces"> </code> </div>
<div class="line number42 index41 alt1"><code class="swift spaces"> </code><code class="swift comments">//类型属性</code></div>
<div class="line number43 index42 alt2"><code class="swift spaces"> </code><code class="swift keyword">static</code> <code class="swift keyword">var</code> <code class="swift variable">skin</code><code class="swift plain">:</code><code class="swift color2">Array</code><code class="swift plain"><</code><code class="swift color2">String</code><code class="swift plain">></code><code class="swift plain">{</code></div>
<div class="line number44 index43 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift plain">[</code><code class="swift string">"yellow"</code><code class="swift plain">,</code><code class="swift string">"white"</code><code class="swift plain">,</code><code class="swift string">"black"</code><code class="swift plain">];</code></div>
<div class="line number45 index44 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number46 index45 alt1"> </div>
<div class="line number47 index46 alt2"><code class="swift plain">}</code></div>
<div class="line number48 index47 alt1"> </div>
<div class="line number49 index48 alt2"><code class="swift keyword">var</code> <code class="swift variable">p</code><code class="swift plain">=</code><code class="swift variable">Person</code><code class="swift plain">(</code><code class="swift variable">firstName</code><code class="swift plain">: </code><code class="swift string">"Kenshin"</code><code class="swift plain">, </code><code class="swift variable">lastName</code><code class="swift plain">: </code><code class="swift string">"Cui"</code><code class="swift plain">,</code><code class="swift variable">age</code><code class="swift plain">:</code><code class="swift value">29</code><code class="swift plain">)</code></div>
<div class="line number50 index49 alt1"><code class="swift variable">p</code><code class="swift plain">.</code><code class="swift variable">account</code><code class="swift plain">.</code><code class="swift variable">balance</code><code class="swift plain">=</code><code class="swift value">1.0</code></div>
<div class="line number51 index50 alt2"><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"p.account.balance=\(</code><code class="swift variable">p</code><code class="swift plain">.</code><code class="swift variable">account</code><code class="swift plain">.</code><code class="swift variable">balance</code><code class="swift string">)"</code><code class="swift plain">) </code><code class="swift comments">//结果:p.account.balance=3.0</code></div>
<div class="line number52 index51 alt1"><code class="swift keyword">for</code> <code class="swift variable">color</code> <code class="swift keyword">in</code> <code class="swift variable">Person</code><code class="swift plain">.</code><code class="swift variable">skin</code> <code class="swift plain">{</code></div>
<div class="line number53 index52 alt2"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift variable">color</code><code class="swift plain">)</code></div>
<div class="line number54 index53 alt1"><code class="swift plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<ol>
<li> 和setter方法中的newValue一样,默认情况下载willSet和didSet中会有一个newValue和oldValue参数表示要设置的新值和已经被修改过的旧值(当然参数名同样可以自定义);</li>
<li>存储属性的默认值设置不会引起属性监视器的调用(另外在构造方法中赋值也不会引起属性监视器调用),只有在外部设置存储属性才会引起属性监视器调用;</li>
<li>存储属性的属性监视器willSet、didSet内可以直接访问属性,但是在计算属性的get、set方法中不能直接访问计算属性,否则会引起循环调用;</li>
<li>在didSet中可以修改属性的值,这个值将作为最终值(在willSet中无法修改);</li>
</ol>
<h2 id="method">方法</h2>
<p>方法就是与某个特定类关联的函数,其用法和前面介绍的函数并无二致,但是和ObjC相比,ObjC中的函数必须是C语言,而方法则必须是ObjC。此外其他语言中方法通常存在于类中,但是Swift中的方法除了在类中使用还可以在结构体、枚举中使用。关于普通的方法这里不做过多赘述,用法和前面的函数区别也不大,这里主要看一下构造方法。</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_693615" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
<div class="line number38 index37 alt1">38</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift keyword">class</code> <code class="swift variable">Person</code> <code class="swift plain">{</code></div>
<div class="line number2 index1 alt1"><code class="swift spaces"> </code><code class="swift comments">//定义属性</code></div>
<div class="line number3 index2 alt2"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">name</code><code class="swift plain">:</code><code class="swift color2">String</code></div>
<div class="line number4 index3 alt1"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">height</code><code class="swift plain">:</code><code class="swift color2">Double</code></div>
<div class="line number5 index4 alt2"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">age</code><code class="swift plain">=</code><code class="swift value">0</code></div>
<div class="line number6 index5 alt1"><code class="swift spaces"> </code> </div>
<div class="line number7 index6 alt2"><code class="swift spaces"> </code><code class="swift comments">//指定构造器方法,注意如果不编写构造方法默认会自动创建一个无参构造方法</code></div>
<div class="line number8 index7 alt1"><code class="swift spaces"> </code><code class="swift keyword">init</code><code class="swift plain">(</code><code class="swift variable">name</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">,</code><code class="swift variable">height</code><code class="swift plain">:</code><code class="swift color2">Double</code><code class="swift plain">,</code><code class="swift variable">age</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">){</code></div>
<div class="line number9 index8 alt2"><code class="swift spaces"> </code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">name</code><code class="swift plain">=</code><code class="swift variable">name</code></div>
<div class="line number10 index9 alt1"><code class="swift spaces"> </code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">height</code><code class="swift plain">=</code><code class="swift variable">height</code></div>
<div class="line number11 index10 alt2"><code class="swift spaces"> </code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">age</code><code class="swift plain">=</code><code class="swift variable">age</code></div>
<div class="line number12 index11 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number13 index12 alt2"><code class="swift spaces"> </code> </div>
<div class="line number14 index13 alt1"><code class="swift spaces"> </code><code class="swift comments">//便利构造方法,通过调用指定构造方法、提供默认值来简化构造方法实现</code></div>
<div class="line number15 index14 alt2"><code class="swift spaces"> </code><code class="swift variable">convenience</code> <code class="swift keyword">init</code><code class="swift plain">(</code><code class="swift variable">name</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">){</code></div>
<div class="line number16 index15 alt1"><code class="swift spaces"> </code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift keyword">init</code><code class="swift plain">(</code><code class="swift variable">name</code><code class="swift plain">:</code><code class="swift variable">name</code><code class="swift plain">,</code><code class="swift variable">height</code><code class="swift plain">:</code><code class="swift value">0.0</code><code class="swift plain">,</code><code class="swift variable">age</code><code class="swift plain">:</code><code class="swift value">0</code><code class="swift plain">)</code></div>
<div class="line number17 index16 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number18 index17 alt1"><code class="swift spaces"> </code> </div>
<div class="line number19 index18 alt2"><code class="swift spaces"> </code><code class="swift comments">//实例方法</code></div>
<div class="line number20 index19 alt1"><code class="swift spaces"> </code><code class="swift keyword">func</code> <code class="swift variable">modifyInfoWithAge</code><code class="swift plain">(</code><code class="swift variable">age</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">,</code><code class="swift variable">height</code><code class="swift plain">:</code><code class="swift color2">Double</code><code class="swift plain">){</code></div>
<div class="line number21 index20 alt2"><code class="swift spaces"> </code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">age</code><code class="swift plain">=</code><code class="swift variable">age</code></div>
<div class="line number22 index21 alt1"><code class="swift spaces"> </code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">height</code><code class="swift plain">=</code><code class="swift variable">height</code></div>
<div class="line number23 index22 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number24 index23 alt1"><code class="swift spaces"> </code> </div>
<div class="line number25 index24 alt2"><code class="swift spaces"> </code><code class="swift comments">//类型方法</code></div>
<div class="line number26 index25 alt1"><code class="swift spaces"> </code><code class="swift keyword">class</code> <code class="swift keyword">func</code> <code class="swift variable">showClassName</code><code class="swift plain">(){</code></div>
<div class="line number27 index26 alt2"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"Class name is \"Person\""</code><code class="swift plain">)</code></div>
<div class="line number28 index27 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number29 index28 alt2"><code class="swift spaces"> </code> </div>
<div class="line number30 index29 alt1"><code class="swift spaces"> </code><code class="swift comments">//析构方法,在对象被释放时调用,类似于ObjC的dealloc,注意此函数没有括号,没有参数,无法直接调用</code></div>
<div class="line number31 index30 alt2"><code class="swift spaces"> </code><code class="swift keyword">deinit</code><code class="swift plain">{</code></div>
<div class="line number32 index31 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"deinit..."</code><code class="swift plain">)</code></div>
<div class="line number33 index32 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number34 index33 alt1"><code class="swift spaces"> </code> </div>
<div class="line number35 index34 alt2"><code class="swift plain">}</code></div>
<div class="line number36 index35 alt1"> </div>
<div class="line number37 index36 alt2"><code class="swift comments">//通过便利构造方法创建对象</code></div>
<div class="line number38 index37 alt1"><code class="swift keyword">var</code> <code class="swift variable">p</code><code class="swift plain">=</code><code class="swift variable">Person</code><code class="swift plain">(</code><code class="swift variable">name</code><code class="swift plain">: </code><code class="swift string">"kenshin"</code><code class="swift plain">)</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<ol>
<li>除构造方法、析构方法外的其他方法的参数默认除了第一个参数是局部参数,从第二个参数开始既是局部参数又是外部参数(这种方式和ObjC的调用方式很类似,当然,可以使用“#”将第一个参数同时声明为外部参数名,也可以使用“_”将其他参数设置为非外部参数名)。但是,对于函数,默认情况下只有默认参数既是局部参数又是外部参数,其他参数都是局部参数。</li>
<li>构造方法的所有参数默认情况下既是外部参数又是局部参数;</li>
<li>Swift中的构造方法分为“指定构造方法”和“便利构造方法(convenience)”,指定构造方法是主要的构造方法,负责初始化所有存储属性,而便利构造方法是辅助构造方法,它通过调用指定构造方法并指定默认值的方式来简化多个构造方法的定义,但是在一个类中至少有一个指定构造方法。</li>
</ol>
<h2 id="subscript">下标脚本</h2>
<p>下标脚本是一种访问集合的快捷方式,例如:var a:,我们经常使用a、a这种方式访问a中的元素,0和1在这里就是一个索引,通过这种方式访问或者设置集合中的元素在Swift中称之为“下标脚本”(类似于C#中的索引器)。从定义形式上通过“subscript”关键字来定义一个下标脚本,很像方法的定义,但是在实现上通过getter、setter实现读写又类似于属性。假设用Record表示一条记录,其中有多列,下面示例中演示了如何使用下标脚本访问并设置某一列的值。</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_458405" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift keyword">class</code> <code class="swift variable">Record</code> <code class="swift plain">{</code></div>
<div class="line number2 index1 alt1"><code class="swift spaces"> </code><code class="swift comments">//定义属性,假设store是Record内部的存储结构</code></div>
<div class="line number3 index2 alt2"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">store</code><code class="swift plain">:[</code><code class="swift color2">String</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">]</code></div>
<div class="line number4 index3 alt1"><code class="swift spaces"> </code> </div>
<div class="line number5 index4 alt2"><code class="swift spaces"> </code><code class="swift keyword">init</code><code class="swift plain">(</code><code class="swift variable">data</code><code class="swift plain">:[</code><code class="swift color2">String</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">]){</code></div>
<div class="line number6 index5 alt1"><code class="swift spaces"> </code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">store</code><code class="swift plain">=</code><code class="swift variable">data</code></div>
<div class="line number7 index6 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number8 index7 alt1"><code class="swift spaces"> </code> </div>
<div class="line number9 index8 alt2"><code class="swift spaces"> </code><code class="swift comments">//下标脚本(注意也可以实现只有getter的只读下标脚本)</code></div>
<div class="line number10 index9 alt1"><code class="swift spaces"> </code><code class="swift keyword">subscript</code><code class="swift plain">(</code><code class="swift variable">index</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">)-</code><code class="swift plain">></code><code class="swift color2">String</code><code class="swift plain">{</code></div>
<div class="line number11 index10 alt2"><code class="swift spaces"> </code><code class="swift keyword">get</code><code class="swift plain">{</code></div>
<div class="line number12 index11 alt1"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">key</code><code class="swift plain">=</code><code class="swift variable">sorted</code><code class="swift plain">(</code><code class="swift color2">Array</code><code class="swift plain">(</code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">store</code><code class="swift plain">.</code><code class="swift variable">keys</code><code class="swift plain">))[</code><code class="swift variable">index</code><code class="swift plain">]</code></div>
<div class="line number13 index12 alt2"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">store</code><code class="swift plain">[</code><code class="swift variable">key</code><code class="swift plain">]!</code></div>
<div class="line number14 index13 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number15 index14 alt2"><code class="swift spaces"> </code><code class="swift keyword">set</code><code class="swift plain">{</code></div>
<div class="line number16 index15 alt1"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">key</code><code class="swift plain">=</code><code class="swift variable">sorted</code><code class="swift plain">(</code><code class="swift color2">Array</code><code class="swift plain">(</code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">store</code><code class="swift plain">.</code><code class="swift variable">keys</code><code class="swift plain">))[</code><code class="swift variable">index</code><code class="swift plain">]</code></div>
<div class="line number17 index16 alt2"><code class="swift spaces"> </code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">store</code><code class="swift plain">[</code><code class="swift variable">key</code><code class="swift plain">]=</code><code class="swift variable">newValue</code> <code class="swift comments">//newValue参数名可以像属性一样重新自定义</code></div>
<div class="line number18 index17 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number19 index18 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number20 index19 alt1"><code class="swift spaces"> </code> </div>
<div class="line number21 index20 alt2"><code class="swift spaces"> </code><code class="swift comments">//下标脚本(重载)</code></div>
<div class="line number22 index21 alt1"><code class="swift spaces"> </code><code class="swift keyword">subscript</code><code class="swift plain">(</code><code class="swift variable">key</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">)-</code><code class="swift plain">></code><code class="swift color2">String</code><code class="swift plain">{</code></div>
<div class="line number23 index22 alt2"><code class="swift spaces"> </code><code class="swift keyword">get</code><code class="swift plain">{</code></div>
<div class="line number24 index23 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift variable">store</code><code class="swift plain">[</code><code class="swift variable">key</code><code class="swift plain">]!</code></div>
<div class="line number25 index24 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number26 index25 alt1"><code class="swift spaces"> </code><code class="swift keyword">set</code><code class="swift plain">{</code></div>
<div class="line number27 index26 alt2"><code class="swift spaces"> </code><code class="swift variable">store</code><code class="swift plain">[</code><code class="swift variable">key</code><code class="swift plain">]=</code><code class="swift variable">newValue</code></div>
<div class="line number28 index27 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number29 index28 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number30 index29 alt1"><code class="swift plain">}</code></div>
<div class="line number31 index30 alt2"> </div>
<div class="line number32 index31 alt1"><code class="swift keyword">var</code> <code class="swift variable">r</code><code class="swift plain">=</code><code class="swift variable">Record</code><code class="swift plain">(</code><code class="swift variable">data</code><code class="swift plain">:[</code><code class="swift string">"name"</code><code class="swift plain">:</code><code class="swift string">"kenshin"</code><code class="swift plain">,</code><code class="swift string">"sex"</code><code class="swift plain">:</code><code class="swift string">"male"</code><code class="swift plain">])</code></div>
<div class="line number33 index32 alt2"><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"r=\(</code><code class="swift variable">r</code><code class="swift plain">[</code><code class="swift value">0</code><code class="swift plain">]</code><code class="swift string">)"</code><code class="swift plain">) </code><code class="swift comments">//结果:r=kenshin</code></div>
<div class="line number34 index33 alt1"><code class="swift variable">r</code><code class="swift plain">[</code><code class="swift string">"sex"</code><code class="swift plain">]=</code><code class="swift string">"female"</code></div>
<div class="line number35 index34 alt2"><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift variable">r</code><code class="swift plain">[</code><code class="swift value">1</code><code class="swift plain">]) </code><code class="swift comments">//结果:female</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<h2 id="inheritance">继承</h2>
<p>和ObjC一样,Swift也是单继承的(可以实现多个协议,此时协议放在后面),子类可以调用父类的属性、方法,重写父类的方法,添加属性监视器,甚至可以将只读属性重写成读写属性。</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_792196" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
<div class="line number38 index37 alt1">38</div>
<div class="line number39 index38 alt2">39</div>
<div class="line number40 index39 alt1">40</div>
<div class="line number41 index40 alt2">41</div>
<div class="line number42 index41 alt1">42</div>
<div class="line number43 index42 alt2">43</div>
<div class="line number44 index43 alt1">44</div>
<div class="line number45 index44 alt2">45</div>
<div class="line number46 index45 alt1">46</div>
<div class="line number47 index46 alt2">47</div>
<div class="line number48 index47 alt1">48</div>
<div class="line number49 index48 alt2">49</div>
<div class="line number50 index49 alt1">50</div>
<div class="line number51 index50 alt2">51</div>
<div class="line number52 index51 alt1">52</div>
<div class="line number53 index52 alt2">53</div>
<div class="line number54 index53 alt1">54</div>
<div class="line number55 index54 alt2">55</div>
<div class="line number56 index55 alt1">56</div>
<div class="line number57 index56 alt2">57</div>
<div class="line number58 index57 alt1">58</div>
<div class="line number59 index58 alt2">59</div>
<div class="line number60 index59 alt1">60</div>
<div class="line number61 index60 alt2">61</div>
<div class="line number62 index61 alt1">62</div>
<div class="line number63 index62 alt2">63</div>
<div class="line number64 index63 alt1">64</div>
<div class="line number65 index64 alt2">65</div>
<div class="line number66 index65 alt1">66</div>
<div class="line number67 index66 alt2">67</div>
<div class="line number68 index67 alt1">68</div>
<div class="line number69 index68 alt2">69</div>
<div class="line number70 index69 alt1">70</div>
<div class="line number71 index70 alt2">71</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift keyword">class</code> <code class="swift variable">Person</code> <code class="swift plain">{</code></div>
<div class="line number2 index1 alt1"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">firstName</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">,</code><code class="swift variable">lastName</code><code class="swift plain">:</code><code class="swift color2">String</code></div>
<div class="line number3 index2 alt2"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">age</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">=</code><code class="swift value">0</code></div>
<div class="line number4 index3 alt1"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">fullName</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">{</code></div>
<div class="line number5 index4 alt2"><code class="swift spaces"> </code><code class="swift keyword">get</code><code class="swift plain">{</code></div>
<div class="line number6 index5 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift variable">firstName</code><code class="swift plain">+</code><code class="swift string">" "</code><code class="swift plain">+</code><code class="swift variable">lastName</code></div>
<div class="line number7 index6 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number8 index7 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number9 index8 alt2"><code class="swift spaces"> </code> </div>
<div class="line number10 index9 alt1"><code class="swift spaces"> </code><code class="swift keyword">init</code><code class="swift plain">(</code><code class="swift variable">firstName</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">,</code><code class="swift variable">lastName</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">){</code></div>
<div class="line number11 index10 alt2"><code class="swift spaces"> </code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">firstName</code><code class="swift plain">=</code><code class="swift variable">firstName</code></div>
<div class="line number12 index11 alt1"><code class="swift spaces"> </code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">lastName</code><code class="swift plain">=</code><code class="swift variable">lastName</code></div>
<div class="line number13 index12 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number14 index13 alt1"><code class="swift spaces"> </code> </div>
<div class="line number15 index14 alt2"><code class="swift spaces"> </code><code class="swift keyword">func</code> <code class="swift variable">showMessage</code><code class="swift plain">(){</code></div>
<div class="line number16 index15 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"name=\(</code><code class="swift variable">fullName</code><code class="swift string">),age=\(</code><code class="swift variable">age</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number17 index16 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number18 index17 alt1"><code class="swift spaces"> </code> </div>
<div class="line number19 index18 alt2"><code class="swift spaces"> </code><code class="swift comments">//通过final声明,子类无法重写</code></div>
<div class="line number20 index19 alt1"><code class="swift spaces"> </code><code class="swift variable">final</code> <code class="swift keyword">func</code> <code class="swift variable">sayHello</code><code class="swift plain">(){</code></div>
<div class="line number21 index20 alt2"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"hello world."</code><code class="swift plain">)</code></div>
<div class="line number22 index21 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number23 index22 alt2"><code class="swift plain">}</code></div>
<div class="line number24 index23 alt1"> </div>
<div class="line number25 index24 alt2"><code class="swift keyword">class</code> <code class="swift variable">Student</code><code class="swift plain">: </code><code class="swift variable">Person</code> <code class="swift plain">{</code></div>
<div class="line number26 index25 alt1"><code class="swift spaces"> </code><code class="swift comments">//重写属性监视器</code></div>
<div class="line number27 index26 alt2"><code class="swift spaces"> </code><code class="swift keyword">override</code> <code class="swift keyword">var</code> <code class="swift variable">firstName</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">{</code></div>
<div class="line number28 index27 alt1"><code class="swift spaces"> </code><code class="swift keyword">willSet</code><code class="swift plain">{</code></div>
<div class="line number29 index28 alt2"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"oldValue=\(</code><code class="swift variable">firstName</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number30 index29 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number31 index30 alt2"><code class="swift spaces"> </code><code class="swift keyword">didSet</code><code class="swift plain">{</code></div>
<div class="line number32 index31 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"newValue=\(</code><code class="swift variable">firstName</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number33 index32 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number34 index33 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number35 index34 alt2"><code class="swift spaces"> </code> </div>
<div class="line number36 index35 alt1"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">score</code><code class="swift plain">:</code><code class="swift color2">Double</code></div>
<div class="line number37 index36 alt2"><code class="swift spaces"> </code> </div>
<div class="line number38 index37 alt1"><code class="swift spaces"> </code><code class="swift comments">//子类指定构造方法一定要调用父类构造方法</code></div>
<div class="line number39 index38 alt2"><code class="swift spaces"> </code><code class="swift comments">//并且必须在子类存储属性初始化之后调用父类构造方法</code></div>
<div class="line number40 index39 alt1"><code class="swift spaces"> </code><code class="swift keyword">init</code><code class="swift plain">(</code><code class="swift variable">firstName</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">,</code><code class="swift variable">lastName</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">, </code><code class="swift variable">score</code><code class="swift plain">:</code><code class="swift color2">Double</code><code class="swift plain">){</code></div>
<div class="line number41 index40 alt2"><code class="swift spaces"> </code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">score</code><code class="swift plain">=</code><code class="swift variable">score</code></div>
<div class="line number42 index41 alt1"><code class="swift spaces"> </code><code class="swift keyword">super</code><code class="swift plain">.</code><code class="swift keyword">init</code><code class="swift plain">(</code><code class="swift variable">firstName</code><code class="swift plain">: </code><code class="swift variable">firstName</code><code class="swift plain">, </code><code class="swift variable">lastName</code><code class="swift plain">: </code><code class="swift variable">lastName</code><code class="swift plain">)</code></div>
<div class="line number43 index42 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number44 index43 alt1"><code class="swift spaces"> </code> </div>
<div class="line number45 index44 alt2"><code class="swift spaces"> </code><code class="swift variable">convenience</code> <code class="swift keyword">init</code><code class="swift plain">(){</code></div>
<div class="line number46 index45 alt1"><code class="swift spaces"> </code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift keyword">init</code><code class="swift plain">(</code><code class="swift variable">firstName</code><code class="swift plain">:</code><code class="swift string">""</code><code class="swift plain">,</code><code class="swift variable">lastName</code><code class="swift plain">:</code><code class="swift string">""</code><code class="swift plain">,</code><code class="swift variable">score</code><code class="swift plain">:</code><code class="swift value">0</code><code class="swift plain">)</code></div>
<div class="line number47 index46 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number48 index47 alt1"><code class="swift spaces"> </code> </div>
<div class="line number49 index48 alt2"><code class="swift spaces"> </code><code class="swift comments">//将只读属性重写成了可写属性</code></div>
<div class="line number50 index49 alt1"><code class="swift spaces"> </code><code class="swift keyword">override</code> <code class="swift keyword">var</code> <code class="swift variable">fullName</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">{</code></div>
<div class="line number51 index50 alt2"><code class="swift spaces"> </code><code class="swift keyword">get</code><code class="swift plain">{</code></div>
<div class="line number52 index51 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift keyword">super</code><code class="swift plain">.</code><code class="swift variable">fullName</code><code class="swift plain">;</code></div>
<div class="line number53 index52 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number54 index53 alt1"><code class="swift spaces"> </code><code class="swift keyword">set</code><code class="swift plain">{</code></div>
<div class="line number55 index54 alt2"><code class="swift spaces"> </code><code class="swift keyword">let</code> <code class="swift variable">array</code><code class="swift plain">=</code><code class="swift color2">split</code><code class="swift plain">(</code><code class="swift variable">newValue</code><code class="swift plain">, </code><code class="swift variable">maxSplit</code><code class="swift plain">: </code><code class="swift color2">Int</code><code class="swift plain">.</code><code class="swift color2">max</code><code class="swift plain">, </code><code class="swift variable">allowEmptySlices</code><code class="swift plain">: </code><code class="swift color2">false</code><code class="swift plain">, </code><code class="swift variable">isSeparator</code><code class="swift plain">: { $</code><code class="swift value">0</code> <code class="swift plain">== </code><code class="swift string">"."</code> <code class="swift plain">})</code></div>
<div class="line number56 index55 alt1"><code class="swift spaces"> </code><code class="swift keyword">if</code> <code class="swift variable">array</code><code class="swift plain">.</code><code class="swift color2">count</code> <code class="swift plain">== </code><code class="swift value">2</code> <code class="swift plain">{</code></div>
<div class="line number57 index56 alt2"><code class="swift spaces"> </code><code class="swift variable">firstName</code><code class="swift plain">=</code><code class="swift variable">array</code><code class="swift plain">[</code><code class="swift value">0</code><code class="swift plain">]</code></div>
<div class="line number58 index57 alt1"><code class="swift spaces"> </code><code class="swift variable">lastName</code><code class="swift plain">=</code><code class="swift variable">array</code><code class="swift plain">[</code><code class="swift value">1</code><code class="swift plain">]</code></div>
<div class="line number59 index58 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number60 index59 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number61 index60 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number62 index61 alt1"><code class="swift spaces"> </code> </div>
<div class="line number63 index62 alt2"><code class="swift spaces"> </code><code class="swift comments">//重写方法</code></div>
<div class="line number64 index63 alt1"><code class="swift spaces"> </code><code class="swift keyword">override</code> <code class="swift keyword">func</code> <code class="swift variable">showMessage</code><code class="swift plain">() {</code></div>
<div class="line number65 index64 alt2"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"name=\(</code><code class="swift variable">fullName</code><code class="swift string">),age=\(</code><code class="swift variable">age</code><code class="swift string">),score=\(</code><code class="swift variable">score</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number66 index65 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number67 index66 alt2"><code class="swift spaces"> </code> </div>
<div class="line number68 index67 alt1"><code class="swift plain">}</code></div>
<div class="line number69 index68 alt2"> </div>
<div class="line number70 index69 alt1"><code class="swift keyword">var</code> <code class="swift variable">p</code><code class="swift plain">=</code><code class="swift variable">Student</code><code class="swift plain">()</code></div>
<div class="line number71 index70 alt2"><code class="swift variable">p</code><code class="swift plain">.</code><code class="swift variable">firstName</code><code class="swift plain">=</code><code class="swift string">"kenshin"</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>在使用ObjC开发时init构造方法并不安全,首先无法保证init方法只调用一次,其次在init中不能访问属性。但是这些完全依靠文档约定,编译时并不能发现问题,出错检测是被动的。在Swift中构造方法(init)有了更为严格的规定:构造方法执行完之前必须保证所有存储属性都有值。这一点不仅在当前类中必须遵循,在整个继承关系中也必须保证,因此就有了如下的规定:</p>
<ol>
<li>子类的指定构造方法必须调用父类构造方法,并确保调用发生在子类存储属性初始化之后。而且指定构造方法不能调用同一个类中的其他指定构造方法;</li>
<li>便利构造方法必须调用同一个类中的其他指定构造方法(可以是指定构造方法或者便利构造方法),不能直接调用父类构造方法(用以保证最终以指定构造方法结束);</li>
<li>如果父类仅有一个无参构造方法(不管是否包含便利构造方法),子类的构造方法默认就会自动调用父类的无参构造方法(这种情况下可以不用手动调用);</li>
<li>常量属性必须默认指定初始值或者在当前类的构造方法中初始化,不能在子类构造方法中初始化; </li>
</ol>
<h1 id="protocol">协议</h1>
<p>协议是对实例行为的一种约束,和ObjC类似,在Swift中可以定义属性和方法(ObjC中之所以能定义属性是因为@property的本质就是setter、getter方法)。和其他语言不同的是Swift中的协议不仅限于类的实现,它同样可以应用于枚举、结构体(如果只想将一个协议应用于类,可以在定义协议时在后面添加class关键字来限制其应用范围)。</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_908378" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
<div class="line number38 index37 alt1">38</div>
<div class="line number39 index38 alt2">39</div>
<div class="line number40 index39 alt1">40</div>
<div class="line number41 index40 alt2">41</div>
<div class="line number42 index41 alt1">42</div>
<div class="line number43 index42 alt2">43</div>
<div class="line number44 index43 alt1">44</div>
<div class="line number45 index44 alt2">45</div>
<div class="line number46 index45 alt1">46</div>
<div class="line number47 index46 alt2">47</div>
<div class="line number48 index47 alt1">48</div>
<div class="line number49 index48 alt2">49</div>
<div class="line number50 index49 alt1">50</div>
<div class="line number51 index50 alt2">51</div>
<div class="line number52 index51 alt1">52</div>
<div class="line number53 index52 alt2">53</div>
<div class="line number54 index53 alt1">54</div>
<div class="line number55 index54 alt2">55</div>
<div class="line number56 index55 alt1">56</div>
<div class="line number57 index56 alt2">57</div>
<div class="line number58 index57 alt1">58</div>
<div class="line number59 index58 alt2">59</div>
<div class="line number60 index59 alt1">60</div>
<div class="line number61 index60 alt2">61</div>
<div class="line number62 index61 alt1">62</div>
<div class="line number63 index62 alt2">63</div>
<div class="line number64 index63 alt1">64</div>
<div class="line number65 index64 alt2">65</div>
<div class="line number66 index65 alt1">66</div>
<div class="line number67 index66 alt2">67</div>
<div class="line number68 index67 alt1">68</div>
<div class="line number69 index68 alt2">69</div>
<div class="line number70 index69 alt1">70</div>
<div class="line number71 index70 alt2">71</div>
<div class="line number72 index71 alt1">72</div>
<div class="line number73 index72 alt2">73</div>
<div class="line number74 index73 alt1">74</div>
<div class="line number75 index74 alt2">75</div>
<div class="line number76 index75 alt1">76</div>
<div class="line number77 index76 alt2">77</div>
<div class="line number78 index77 alt1">78</div>
<div class="line number79 index78 alt2">79</div>
<div class="line number80 index79 alt1">80</div>
<div class="line number81 index80 alt2">81</div>
<div class="line number82 index81 alt1">82</div>
<div class="line number83 index82 alt2">83</div>
<div class="line number84 index83 alt1">84</div>
<div class="line number85 index84 alt2">85</div>
<div class="line number86 index85 alt1">86</div>
<div class="line number87 index86 alt2">87</div>
<div class="line number88 index87 alt1">88</div>
<div class="line number89 index88 alt2">89</div>
<div class="line number90 index89 alt1">90</div>
<div class="line number91 index90 alt2">91</div>
<div class="line number92 index91 alt1">92</div>
<div class="line number93 index92 alt2">93</div>
<div class="line number94 index93 alt1">94</div>
<div class="line number95 index94 alt2">95</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift keyword">protocol</code> <code class="swift variable">Named</code><code class="swift plain">{</code></div>
<div class="line number2 index1 alt1"><code class="swift spaces"> </code><code class="swift comments">//定义一个实例属性</code></div>
<div class="line number3 index2 alt2"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">name</code><code class="swift plain">:</code><code class="swift color2">String</code> <code class="swift plain">{ </code><code class="swift keyword">get</code> <code class="swift keyword">set</code> <code class="swift plain">}</code></div>
<div class="line number4 index3 alt1"> </div>
<div class="line number5 index4 alt2"><code class="swift spaces"> </code><code class="swift comments">//定义一个类型属性</code></div>
<div class="line number6 index5 alt1"><code class="swift spaces"> </code><code class="swift keyword">static</code> <code class="swift keyword">var</code> <code class="swift variable">className</code><code class="swift plain">:</code><code class="swift color2">String</code> <code class="swift plain">{ </code><code class="swift keyword">get</code> <code class="swift plain">}</code></div>
<div class="line number7 index6 alt2"><code class="swift spaces"> </code> </div>
<div class="line number8 index7 alt1"><code class="swift spaces"> </code><code class="swift comments">//定义构造方法</code></div>
<div class="line number9 index8 alt2"><code class="swift spaces"> </code><code class="swift keyword">init</code><code class="swift plain">(</code><code class="swift variable">name</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">)</code></div>
<div class="line number10 index9 alt1"><code class="swift spaces"> </code> </div>
<div class="line number11 index10 alt2"><code class="swift spaces"> </code><code class="swift comments">//定义一个实例方法</code></div>
<div class="line number12 index11 alt1"><code class="swift spaces"> </code><code class="swift keyword">func</code> <code class="swift variable">showName</code><code class="swift plain">()</code></div>
<div class="line number13 index12 alt2"><code class="swift spaces"> </code> </div>
<div class="line number14 index13 alt1"><code class="swift spaces"> </code><code class="swift comments">//定义一个类型方法</code></div>
<div class="line number15 index14 alt2"><code class="swift spaces"> </code><code class="swift keyword">static</code> <code class="swift keyword">func</code> <code class="swift variable">showClassName</code><code class="swift plain">()</code></div>
<div class="line number16 index15 alt1"><code class="swift plain">}</code></div>
<div class="line number17 index16 alt2"> </div>
<div class="line number18 index17 alt1"><code class="swift keyword">protocol</code> <code class="swift variable">Scored</code><code class="swift plain">{</code></div>
<div class="line number19 index18 alt2"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">score</code><code class="swift plain">:</code><code class="swift color2">Double</code> <code class="swift plain">{ </code><code class="swift keyword">get</code> <code class="swift keyword">set</code> <code class="swift plain">}</code></div>
<div class="line number20 index19 alt1"><code class="swift plain">}</code></div>
<div class="line number21 index20 alt2"> </div>
<div class="line number22 index21 alt1"><code class="swift comments">//Person遵循了Named协议</code></div>
<div class="line number23 index22 alt2"><code class="swift keyword">class</code> <code class="swift variable">Person</code><code class="swift plain">:</code><code class="swift variable">Named</code> <code class="swift plain">{</code></div>
<div class="line number24 index23 alt1"><code class="swift spaces"> </code><code class="swift comments">//注意从Named协议中并不知道name是存储属性还是计算属性,这里将其作为存储属性实现</code></div>
<div class="line number25 index24 alt2"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">name</code><code class="swift plain">:</code><code class="swift color2">String</code></div>
<div class="line number26 index25 alt1"><code class="swift spaces"> </code> </div>
<div class="line number27 index26 alt2"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">age</code><code class="swift plain">:</code><code class="swift color2">Int</code> <code class="swift plain">= </code><code class="swift value">0</code></div>
<div class="line number28 index27 alt1"><code class="swift spaces"> </code> </div>
<div class="line number29 index28 alt2"><code class="swift spaces"> </code><code class="swift keyword">static</code> <code class="swift keyword">var</code> <code class="swift variable">className</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">{</code></div>
<div class="line number30 index29 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift string">"Person"</code></div>
<div class="line number31 index30 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number32 index31 alt1"><code class="swift spaces"> </code> </div>
<div class="line number33 index32 alt2"><code class="swift spaces"> </code><code class="swift comments">//协议中规定的构造方法,必须使用required关键字声明,除非类使用final修饰</code></div>
<div class="line number34 index33 alt1"><code class="swift spaces"> </code><code class="swift variable">required</code> <code class="swift keyword">init</code><code class="swift plain">(</code><code class="swift variable">name</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">){</code></div>
<div class="line number35 index34 alt2"><code class="swift spaces"> </code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">name</code><code class="swift plain">=</code><code class="swift variable">name</code></div>
<div class="line number36 index35 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number37 index36 alt2"><code class="swift spaces"> </code> </div>
<div class="line number38 index37 alt1"><code class="swift spaces"> </code><code class="swift comments">//遵循showName方法</code></div>
<div class="line number39 index38 alt2"><code class="swift spaces"> </code><code class="swift keyword">func</code> <code class="swift variable">showName</code><code class="swift plain">() {</code></div>
<div class="line number40 index39 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"name=\(</code><code class="swift variable">name</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number41 index40 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number42 index41 alt1"><code class="swift spaces"> </code> </div>
<div class="line number43 index42 alt2"><code class="swift spaces"> </code><code class="swift comments">//遵循showClassName方法</code></div>
<div class="line number44 index43 alt1"><code class="swift spaces"> </code><code class="swift keyword">static</code> <code class="swift keyword">func</code> <code class="swift variable">showClassName</code><code class="swift plain">() {</code></div>
<div class="line number45 index44 alt2"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"Class name is \"Person\""</code><code class="swift plain">)</code></div>
<div class="line number46 index45 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number47 index46 alt2"><code class="swift plain">}</code></div>
<div class="line number48 index47 alt1"> </div>
<div class="line number49 index48 alt2"><code class="swift comments">//Student继承于Person并且实现了Scored协议</code></div>
<div class="line number50 index49 alt1"><code class="swift keyword">class</code> <code class="swift variable">Student</code><code class="swift plain">: </code><code class="swift variable">Person</code><code class="swift plain">,</code><code class="swift variable">Scored</code> <code class="swift plain">{</code></div>
<div class="line number51 index50 alt2"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">score</code><code class="swift plain">:</code><code class="swift color2">Double</code><code class="swift plain">=</code><code class="swift value">0.0</code></div>
<div class="line number52 index51 alt1"><code class="swift spaces"> </code> </div>
<div class="line number53 index52 alt2"><code class="swift spaces"> </code><code class="swift keyword">init</code><code class="swift plain">(</code><code class="swift variable">name</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">, </code><code class="swift variable">score</code><code class="swift plain">:</code><code class="swift color2">Double</code><code class="swift plain">){</code></div>
<div class="line number54 index53 alt1"><code class="swift spaces"> </code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">score</code> <code class="swift plain">= </code><code class="swift variable">score</code></div>
<div class="line number55 index54 alt2"><code class="swift spaces"> </code><code class="swift keyword">super</code><code class="swift plain">.</code><code class="swift keyword">init</code><code class="swift plain">(</code><code class="swift variable">name</code><code class="swift plain">: </code><code class="swift variable">name</code><code class="swift plain">)</code></div>
<div class="line number56 index55 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number57 index56 alt2"> </div>
<div class="line number58 index57 alt1"><code class="swift spaces"> </code><code class="swift comments">//由于上面自定义了构造方法则必须实现协议中规定的构造方法</code></div>
<div class="line number59 index58 alt2"><code class="swift spaces"> </code><code class="swift variable">required</code> <code class="swift keyword">init</code><code class="swift plain">(</code><code class="swift variable">name</code><code class="swift plain">: </code><code class="swift color2">String</code><code class="swift plain">) {</code></div>
<div class="line number60 index59 alt1"><code class="swift spaces"> </code><code class="swift keyword">super</code><code class="swift plain">.</code><code class="swift keyword">init</code><code class="swift plain">(</code><code class="swift variable">name</code><code class="swift plain">: </code><code class="swift variable">name</code><code class="swift plain">)</code></div>
<div class="line number61 index60 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number62 index61 alt1"><code class="swift spaces"> </code> </div>
<div class="line number63 index62 alt2"><code class="swift spaces"> </code><code class="swift keyword">func</code> <code class="swift variable">test</code><code class="swift plain">(){</code></div>
<div class="line number64 index63 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"\(</code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">name</code><code class="swift string">) is testing."</code><code class="swift plain">)</code></div>
<div class="line number65 index64 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number66 index65 alt1"><code class="swift plain">}</code></div>
<div class="line number67 index66 alt2"> </div>
<div class="line number68 index67 alt1"><code class="swift keyword">var</code> <code class="swift variable">p</code><code class="swift plain">=</code><code class="swift variable">Person</code><code class="swift plain">(</code><code class="swift variable">name</code><code class="swift plain">: </code><code class="swift string">"Kenshin Cui"</code><code class="swift plain">)</code></div>
<div class="line number69 index68 alt2"><code class="swift variable">p</code><code class="swift plain">.</code><code class="swift variable">showName</code><code class="swift plain">() </code><code class="swift comments">//结果:name=Kenshin Cui</code></div>
<div class="line number70 index69 alt1"><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"className=\(</code><code class="swift variable">Person</code><code class="swift plain">.</code><code class="swift variable">className</code><code class="swift string">)"</code><code class="swift plain">) </code><code class="swift comments">//结果:className=Person</code></div>
<div class="line number71 index70 alt2"><code class="swift variable">Person</code><code class="swift plain">.</code><code class="swift variable">showClassName</code><code class="swift plain">() </code><code class="swift comments">//结果:Class name is "Person"</code></div>
<div class="line number72 index71 alt1"><code class="swift variable">p</code><code class="swift plain">.</code><code class="swift variable">age</code><code class="swift plain">=</code><code class="swift value">28</code></div>
<div class="line number73 index72 alt2"> </div>
<div class="line number74 index73 alt1"><code class="swift keyword">var</code> <code class="swift variable">s</code><code class="swift plain">:</code><code class="swift variable">Named</code><code class="swift plain">=</code><code class="swift variable">Student</code><code class="swift plain">(</code><code class="swift variable">name</code><code class="swift plain">: </code><code class="swift string">"Kaoru"</code><code class="swift plain">,</code><code class="swift variable">score</code><code class="swift plain">:</code><code class="swift value">100.0</code><code class="swift plain">) </code><code class="swift comments">//尽管这里将s声明为Named类型,但是运行时仍然可以正确的解析(多态),但是注意此时编译器并不知道s有test方法,所以此时调用test()会报错</code></div>
<div class="line number75 index74 alt2"><code class="swift variable">s</code><code class="swift plain">.</code><code class="swift variable">showName</code><code class="swift plain">()</code></div>
<div class="line number76 index75 alt1"> </div>
<div class="line number77 index76 alt2"><code class="swift comments">//在下面的函数中要求参数stu必须实现两个协议</code></div>
<div class="line number78 index77 alt1"><code class="swift keyword">func</code> <code class="swift variable">showMessage</code><code class="swift plain">(</code><code class="swift variable">stu</code><code class="swift plain">:</code><code class="swift keyword">protocol</code><code class="swift plain"><</code><code class="swift variable">Named</code><code class="swift plain">,</code><code class="swift variable">Scored</code><code class="swift plain">></code><code class="swift plain">){</code></div>
<div class="line number79 index78 alt2"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"name=\(</code><code class="swift variable">stu</code><code class="swift plain">.</code><code class="swift variable">name</code><code class="swift string">),score=\(</code><code class="swift variable">stu</code><code class="swift plain">.</code><code class="swift variable">score</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number80 index79 alt1"><code class="swift plain">}</code></div>
<div class="line number81 index80 alt2"><code class="swift keyword">var</code> <code class="swift variable">s2</code><code class="swift plain">=</code><code class="swift variable">Student</code><code class="swift plain">(</code><code class="swift variable">name</code><code class="swift plain">: </code><code class="swift string">"Tom"</code><code class="swift plain">,</code><code class="swift variable">score</code><code class="swift plain">:</code><code class="swift value">99.0</code><code class="swift plain">)</code></div>
<div class="line number82 index81 alt1"><code class="swift variable">showMessage</code><code class="swift plain">(</code><code class="swift variable">s2</code><code class="swift plain">) </code><code class="swift comments">//结果:name=Tom,age=99.0</code></div>
<div class="line number83 index82 alt2"> </div>
<div class="line number84 index83 alt1"> </div>
<div class="line number85 index84 alt2"><code class="swift comments">//检测协议</code></div>
<div class="line number86 index85 alt1"><code class="swift keyword">let</code> <code class="swift variable">b1</code> <code class="swift plain">= </code><code class="swift variable">s</code> <code class="swift keyword">is</code> <code class="swift variable">Scored</code> <code class="swift comments">//判断p是否遵循了Scored协议</code></div>
<div class="line number87 index86 alt2"><code class="swift keyword">if</code> <code class="swift variable">b1</code> <code class="swift plain">{</code></div>
<div class="line number88 index87 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"s has score property."</code><code class="swift plain">)</code></div>
<div class="line number89 index88 alt2"><code class="swift plain">}</code></div>
<div class="line number90 index89 alt1"><code class="swift comments">//类型转化</code></div>
<div class="line number91 index90 alt2"><code class="swift keyword">if</code> <code class="swift keyword">let</code> <code class="swift variable">s3</code> <code class="swift plain">= </code><code class="swift variable">s</code> <code class="swift keyword">as</code><code class="swift plain">? </code><code class="swift variable">Scored</code> <code class="swift plain">{ </code><code class="swift comments">//如果s转化成了Scored类型则返回实例,否则为nil</code></div>
<div class="line number92 index91 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"s3' score is \(</code><code class="swift variable">s3</code><code class="swift plain">.</code><code class="swift variable">score</code><code class="swift string">)"</code><code class="swift plain">) </code><code class="swift comments">//结果:s3' score is 100.0</code></div>
<div class="line number93 index92 alt2"><code class="swift plain">}</code></div>
<div class="line number94 index93 alt1"><code class="swift keyword">let</code> <code class="swift variable">s4</code> <code class="swift plain">= </code><code class="swift variable">s</code> <code class="swift keyword">as</code><code class="swift plain">! </code><code class="swift variable">Scored</code> <code class="swift comments">//强制转换,如果转化失败则报错</code></div>
<div class="line number95 index94 alt2"><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"s4' score is \(</code><code class="swift variable">s4</code><code class="swift plain">.</code><code class="swift variable">score</code><code class="swift string">)"</code><code class="swift plain">) </code><code class="swift comments">//结果:s4' score is 100.0</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<ol>
<li>协议中虽然可以指定属性的读写,但即使协议中规定属性是只读的但在使用时也可以将其实现成可读写的;</li>
<li>Swift的协议中可以约定属性是实例属性还是类型属性、是读写属性还是只读属性,但是不能约束其是存储属性还是计算属性;</li>
<li>协议中的类型属性和类型方法使用static修饰而不是class(尽管对于类的实现中类型属性、类型方法使用class修饰);</li>
<li>协议中约定的方法支持可变参数,但是不支持默认参数;</li>
<li>协议中约定的构造方法,在实现时如果不是final类则必须使用require修饰(以保证子类如果需要自定义构造方法则必须覆盖父类实现的协议构造方法,如果子类不需要自定义构造方法则不必);</li>
<li>一个协议可以继承于另外一个或多个协议,一个类只能继承于一个类但可以实现多个协议;</li>
<li>协议本身就是一种类型,这也体现除了面向对象的多态特征,可以使用多个协议的合成来约束一个实例参数必须实现某几个协议;</li>
</ol>
<h1 id="extension">扩展</h1>
<p>Swift中的扩展就类似于ObjC中的分类(事实上在其他高级语言中更多的称之为扩展而非分类),但是它要比分类强大的多,它不仅可以扩展类还可以扩展协议、枚举、结构体,另外扩展也不局限于扩展方法(实例方法或者类型方法),还可以扩展便利构造方法、计算属性、下标脚本、</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_238035" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
<div class="line number38 index37 alt1">38</div>
<div class="line number39 index38 alt2">39</div>
<div class="line number40 index39 alt1">40</div>
<div class="line number41 index40 alt2">41</div>
<div class="line number42 index41 alt1">42</div>
<div class="line number43 index42 alt2">43</div>
<div class="line number44 index43 alt1">44</div>
<div class="line number45 index44 alt2">45</div>
<div class="line number46 index45 alt1">46</div>
<div class="line number47 index46 alt2">47</div>
<div class="line number48 index47 alt1">48</div>
<div class="line number49 index48 alt2">49</div>
<div class="line number50 index49 alt1">50</div>
<div class="line number51 index50 alt2">51</div>
<div class="line number52 index51 alt1">52</div>
<div class="line number53 index52 alt2">53</div>
<div class="line number54 index53 alt1">54</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift keyword">class</code> <code class="swift variable">Person</code> <code class="swift plain">{</code></div>
<div class="line number2 index1 alt1"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">firstName</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">,</code><code class="swift variable">lastName</code><code class="swift plain">:</code><code class="swift color2">String</code></div>
<div class="line number3 index2 alt2"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">age</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">=</code><code class="swift value">0</code></div>
<div class="line number4 index3 alt1"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">fullName</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">{</code></div>
<div class="line number5 index4 alt2"><code class="swift spaces"> </code><code class="swift keyword">get</code><code class="swift plain">{</code></div>
<div class="line number6 index5 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift variable">firstName</code><code class="swift plain">+</code><code class="swift string">" "</code><code class="swift plain">+</code><code class="swift variable">lastName</code></div>
<div class="line number7 index6 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number8 index7 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number9 index8 alt2"><code class="swift spaces"> </code> </div>
<div class="line number10 index9 alt1"><code class="swift spaces"> </code><code class="swift keyword">init</code><code class="swift plain">(</code><code class="swift variable">firstName</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">,</code><code class="swift variable">lastName</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">){</code></div>
<div class="line number11 index10 alt2"><code class="swift spaces"> </code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">firstName</code><code class="swift plain">=</code><code class="swift variable">firstName</code></div>
<div class="line number12 index11 alt1"><code class="swift spaces"> </code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">lastName</code><code class="swift plain">=</code><code class="swift variable">lastName</code></div>
<div class="line number13 index12 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number14 index13 alt1"><code class="swift spaces"> </code> </div>
<div class="line number15 index14 alt2"><code class="swift spaces"> </code><code class="swift keyword">func</code> <code class="swift variable">showMessage</code><code class="swift plain">(){</code></div>
<div class="line number16 index15 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"name=\(</code><code class="swift variable">fullName</code><code class="swift string">),age=\(</code><code class="swift variable">age</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number17 index16 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number18 index17 alt1"><code class="swift plain">}</code></div>
<div class="line number19 index18 alt2"> </div>
<div class="line number20 index19 alt1"><code class="swift keyword">extension</code> <code class="swift variable">Person</code><code class="swift plain">{</code></div>
<div class="line number21 index20 alt2"><code class="swift spaces"> </code> </div>
<div class="line number22 index21 alt1"><code class="swift spaces"> </code><code class="swift comments">//只能扩展便利构造方法,不能扩展指定构造方法</code></div>
<div class="line number23 index22 alt2"><code class="swift spaces"> </code><code class="swift variable">convenience</code> <code class="swift keyword">init</code><code class="swift plain">(){</code></div>
<div class="line number24 index23 alt1"><code class="swift spaces"> </code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift keyword">init</code><code class="swift plain">(</code><code class="swift variable">firstName</code><code class="swift plain">:</code><code class="swift string">""</code><code class="swift plain">,</code><code class="swift variable">lastName</code><code class="swift plain">:</code><code class="swift string">""</code><code class="swift plain">)</code></div>
<div class="line number25 index24 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number26 index25 alt1"><code class="swift spaces"> </code> </div>
<div class="line number27 index26 alt2"><code class="swift spaces"> </code><code class="swift comments">//只能扩展计算属性,无法扩展存储属性</code></div>
<div class="line number28 index27 alt1"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">personInfo</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">{</code></div>
<div class="line number29 index28 alt2"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift string">"firstName=\(</code><code class="swift variable">firstName</code><code class="swift string">),lastName=\(</code><code class="swift variable">lastName</code><code class="swift string">),age=\(</code><code class="swift variable">age</code><code class="swift string">)"</code><code class="swift plain">;</code></div>
<div class="line number30 index29 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number31 index30 alt2"> </div>
<div class="line number32 index31 alt1"><code class="swift spaces"> </code><code class="swift comments">//扩展实例方法</code></div>
<div class="line number33 index32 alt2"><code class="swift spaces"> </code><code class="swift keyword">func</code> <code class="swift variable">sayHello</code><code class="swift plain">(){</code></div>
<div class="line number34 index33 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"hello world."</code><code class="swift plain">)</code></div>
<div class="line number35 index34 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number36 index35 alt1"><code class="swift spaces"> </code> </div>
<div class="line number37 index36 alt2"><code class="swift spaces"> </code><code class="swift comments">//嵌套类型</code></div>
<div class="line number38 index37 alt1"><code class="swift spaces"> </code><code class="swift keyword">enum</code> <code class="swift variable">SkinColor</code><code class="swift plain">{</code></div>
<div class="line number39 index38 alt2"><code class="swift spaces"> </code><code class="swift keyword">case</code> <code class="swift variable">Yellow</code><code class="swift plain">,</code><code class="swift variable">White</code><code class="swift plain">,</code><code class="swift variable">Black</code></div>
<div class="line number40 index39 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number41 index40 alt2"><code class="swift spaces"> </code> </div>
<div class="line number42 index41 alt1"><code class="swift spaces"> </code><code class="swift comments">//扩展类型方法</code></div>
<div class="line number43 index42 alt2"><code class="swift spaces"> </code><code class="swift keyword">static</code> <code class="swift keyword">func</code> <code class="swift variable">skin</code><code class="swift plain">()-</code><code class="swift plain">></code><code class="swift plain">[</code><code class="swift variable">SkinColor</code><code class="swift plain">]{</code></div>
<div class="line number44 index43 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift plain">[.</code><code class="swift variable">Yellow</code><code class="swift plain">,.</code><code class="swift variable">White</code><code class="swift plain">,.</code><code class="swift variable">Black</code><code class="swift plain">]</code></div>
<div class="line number45 index44 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number46 index45 alt1"><code class="swift plain">}</code></div>
<div class="line number47 index46 alt2"> </div>
<div class="line number48 index47 alt1"><code class="swift keyword">var</code> <code class="swift variable">p</code><code class="swift plain">=</code><code class="swift variable">Person</code><code class="swift plain">()</code></div>
<div class="line number49 index48 alt2"><code class="swift variable">p</code><code class="swift plain">.</code><code class="swift variable">firstName</code><code class="swift plain">=</code><code class="swift string">"Kenshin"</code></div>
<div class="line number50 index49 alt1"><code class="swift variable">p</code><code class="swift plain">.</code><code class="swift variable">lastName</code><code class="swift plain">=</code><code class="swift string">"Cui"</code></div>
<div class="line number51 index50 alt2"><code class="swift variable">p</code><code class="swift plain">.</code><code class="swift variable">age</code><code class="swift plain">=</code><code class="swift value">28</code></div>
<div class="line number52 index51 alt1"><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift variable">p</code><code class="swift plain">.</code><code class="swift variable">personInfo</code><code class="swift plain">) </code><code class="swift comments">//结果:firstName=Kenshin,lastName=Cui,age=28</code></div>
<div class="line number53 index52 alt2"><code class="swift variable">p</code><code class="swift plain">.</code><code class="swift variable">sayHello</code><code class="swift plain">() </code><code class="swift comments">//结果:hello world.</code></div>
<div class="line number54 index53 alt1"><code class="swift variable">Person</code><code class="swift plain">.</code><code class="swift variable">skin</code><code class="swift plain">()</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<h1 id="enumAndStruct">枚举和结构体</h1>
<h2 id="struct">结构体</h2>
<p>结构体和类是构造复杂数据类型时常用的构造体,在其他高级语言中结构体相比于类要简单的多(在结构体内部仅仅能定义一些简单成员),但是在Swift中结构体和类的关系要紧密的多,这也是为什么将结构体放到后面来说的原因。Swift中的结构体可以定义属性、方法、下标脚本、构造方法,支持扩展,可以实现协议等等,很多类可以实现的功能结构体都能实现,但是结构体和类有着本质区别:类是引用类型,结构体是值类型。</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_468140" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift keyword">struct</code> <code class="swift variable">Person</code> <code class="swift plain">{</code></div>
<div class="line number2 index1 alt1"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">firstName</code><code class="swift plain">:</code><code class="swift color2">String</code></div>
<div class="line number3 index2 alt2"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">lastName</code><code class="swift plain">:</code><code class="swift color2">String</code></div>
<div class="line number4 index3 alt1"><code class="swift spaces"> </code> </div>
<div class="line number5 index4 alt2"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">fullName</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">{</code></div>
<div class="line number6 index5 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift variable">firstName</code> <code class="swift plain">+ </code><code class="swift string">" "</code> <code class="swift plain">+ </code><code class="swift variable">lastName</code></div>
<div class="line number7 index6 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number8 index7 alt1"><code class="swift spaces"> </code> </div>
<div class="line number9 index8 alt2"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">age</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">=</code><code class="swift value">0</code></div>
<div class="line number10 index9 alt1"><code class="swift spaces"> </code> </div>
<div class="line number11 index10 alt2"><code class="swift spaces"> </code><code class="swift comments">//构造函数,如果定义了构造方法则不会再自动生成默认构造函数</code></div>
<div class="line number12 index11 alt1"><code class="swift comments">// init(firstName:String,lastName:String){</code></div>
<div class="line number13 index12 alt2"><code class="swift comments">// self.firstName=firstName</code></div>
<div class="line number14 index13 alt1"><code class="swift comments">// self.lastName=lastName</code></div>
<div class="line number15 index14 alt2"><code class="swift comments">// }</code></div>
<div class="line number16 index15 alt1"><code class="swift spaces"> </code> </div>
<div class="line number17 index16 alt2"><code class="swift spaces"> </code><code class="swift keyword">func</code> <code class="swift variable">showMessage</code><code class="swift plain">(){</code></div>
<div class="line number18 index17 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"firstName=\(</code><code class="swift variable">firstName</code><code class="swift string">),lastName=\(</code><code class="swift variable">lastName</code><code class="swift string">),age=\(</code><code class="swift variable">age</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number19 index18 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number20 index19 alt1"><code class="swift spaces"> </code> </div>
<div class="line number21 index20 alt2"><code class="swift spaces"> </code><code class="swift comments">//注意对于类中声明类型方法使用关键字class修饰,但结构体里使用static修饰</code></div>
<div class="line number22 index21 alt1"><code class="swift spaces"> </code><code class="swift keyword">static</code> <code class="swift keyword">func</code> <code class="swift variable">showStructName</code><code class="swift plain">(){</code></div>
<div class="line number23 index22 alt2"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"Struct name is \"Person\""</code><code class="swift plain">)</code></div>
<div class="line number24 index23 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number25 index24 alt2"><code class="swift plain">}</code></div>
<div class="line number26 index25 alt1"> </div>
<div class="line number27 index26 alt2"><code class="swift comments">//注意所有结构体默认生成一个全员逐一构造函数,一旦自定义构造方法,这个默认构造方法将不会自动生成</code></div>
<div class="line number28 index27 alt1"><code class="swift keyword">var</code> <code class="swift variable">p</code><code class="swift plain">=</code><code class="swift variable">Person</code><code class="swift plain">(</code><code class="swift variable">firstName</code><code class="swift plain">: </code><code class="swift string">"Kenshin"</code><code class="swift plain">, </code><code class="swift variable">lastName</code><code class="swift plain">: </code><code class="swift string">"Cui"</code><code class="swift plain">, </code><code class="swift variable">age</code><code class="swift plain">: </code><code class="swift value">28</code><code class="swift plain">)</code></div>
<div class="line number29 index28 alt2"><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift variable">p</code><code class="swift plain">.</code><code class="swift variable">fullName</code><code class="swift plain">) </code><code class="swift comments">//结果:Kenshin Cui</code></div>
<div class="line number30 index29 alt1"><code class="swift variable">p</code><code class="swift plain">.</code><code class="swift variable">showMessage</code><code class="swift plain">() </code><code class="swift comments">//结果:firstName "Kenshin", lastName "Cui", age 28</code></div>
<div class="line number31 index30 alt2"><code class="swift variable">Person</code><code class="swift plain">.</code><code class="swift variable">showStructName</code><code class="swift plain">() </code><code class="swift comments">//结果:Struct name is "Person"</code></div>
<div class="line number32 index31 alt1"> </div>
<div class="line number33 index32 alt2"><code class="swift comments">//由于结构体(包括枚举)是值类型所以赋值、参数传递时值会被拷贝(所以下面的实例中p2修改后p并未修改,但是如果是类则情况不同)</code></div>
<div class="line number34 index33 alt1"><code class="swift keyword">var</code> <code class="swift variable">p2</code> <code class="swift plain">= </code><code class="swift variable">p</code></div>
<div class="line number35 index34 alt2"><code class="swift variable">p2</code><code class="swift plain">.</code><code class="swift variable">firstName</code> <code class="swift plain">= </code><code class="swift string">"Tom"</code></div>
<div class="line number36 index35 alt1"><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift variable">p2</code><code class="swift plain">.</code><code class="swift variable">fullName</code><code class="swift plain">) </code><code class="swift comments">//结果:Tom Cui</code></div>
<div class="line number37 index36 alt2"><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift variable">p</code><code class="swift plain">.</code><code class="swift variable">fullName</code><code class="swift plain">) </code><code class="swift comments">//结果:Kenshin Cui</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<ol>
<li>默认情况下如果不自定义构造函数那么将自动生成一个无参构造函数和一个全员的逐一构造函数;</li>
<li>由于结构体是值类型,所以它虽然有构造函数但是没有析构函数,内存释放系统自动管理不需要开发人员过多关注;</li>
<li>类的类型方法使用class修饰(以便子类可以重写),而结构体、枚举的类型方法使用static修饰(补充:类方法也可以使用static修饰,但是不是类型方法而是静态方法;另外类的存储属性如果是类型属性使用static修饰,而类中的计算属性如果是类型属性使用class修饰以便可以被子类重写;换句话说class作为“类型范围作用域”来理解时只有在类中定义类型方法或者类型计算属性时使用,其他情况使用static修饰[包括结构体、枚举、协议和类型存储属性]);</li>
</ol>
<blockquote class="remark">
<p>类的实例通常称之为“对象”,而在Swift中结构体也可以有实例,因此对于很多二者都可以实现的功能,在文中称之为实例而没有使用对象的概念。</p>
</blockquote>
<h2 id="enum">枚举</h2>
<p>在其他语言中枚举本质就是一个整形,只是将这组相关的值组织起来并指定一个有意义的名称。但是在Swift中枚举不强调一个枚举成员必须对应一个整形值(当然如果有必要仍然可以指定),并且枚举类型的可以是整形、浮点型、字符、字符串。首先看一下枚举的基本使用:</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_62756" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift comments">//注意Swift中的枚举默认并没有对应的整形值,case用来定义一行新的成员,也可以将多个值定义到同一行使用逗号分隔,例如:case Spring,Summer,Autumn,Winter</code></div>
<div class="line number2 index1 alt1"><code class="swift keyword">enum</code> <code class="swift variable">Season</code><code class="swift plain">{</code></div>
<div class="line number3 index2 alt2"><code class="swift spaces"> </code><code class="swift keyword">case</code> <code class="swift variable">Spring</code></div>
<div class="line number4 index3 alt1"><code class="swift spaces"> </code><code class="swift keyword">case</code> <code class="swift variable">Summer</code></div>
<div class="line number5 index4 alt2"><code class="swift spaces"> </code><code class="swift keyword">case</code> <code class="swift variable">Autumn</code></div>
<div class="line number6 index5 alt1"><code class="swift spaces"> </code><code class="swift keyword">case</code> <code class="swift variable">Winter</code></div>
<div class="line number7 index6 alt2"><code class="swift plain">}</code></div>
<div class="line number8 index7 alt1"> </div>
<div class="line number9 index8 alt2"><code class="swift keyword">var</code> <code class="swift variable">s</code><code class="swift plain">=</code><code class="swift variable">Season</code><code class="swift plain">.</code><code class="swift variable">Spring</code></div>
<div class="line number10 index9 alt1"> </div>
<div class="line number11 index10 alt2"><code class="swift comments">//一旦确定了枚举类型,赋值时可以去掉类型实现简写</code></div>
<div class="line number12 index11 alt1"><code class="swift variable">s</code> <code class="swift plain">= .</code><code class="swift variable">Summer</code></div>
<div class="line number13 index12 alt2"> </div>
<div class="line number14 index13 alt1"><code class="swift keyword">switch</code> <code class="swift variable">s</code> <code class="swift plain">{</code></div>
<div class="line number15 index14 alt2"><code class="swift keyword">case</code> <code class="swift plain">.</code><code class="swift variable">Spring</code><code class="swift plain">: </code><code class="swift comments">//由于Swift的自动推断,这里仍然可以不指明类型</code></div>
<div class="line number16 index15 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"spring"</code><code class="swift plain">)</code></div>
<div class="line number17 index16 alt2"><code class="swift keyword">case</code> <code class="swift plain">.</code><code class="swift variable">Summer</code><code class="swift plain">:</code></div>
<div class="line number18 index17 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"summer"</code><code class="swift plain">)</code></div>
<div class="line number19 index18 alt2"><code class="swift keyword">case</code> <code class="swift plain">.</code><code class="swift variable">Autumn</code><code class="swift plain">:</code></div>
<div class="line number20 index19 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"autumn"</code><code class="swift plain">)</code></div>
<div class="line number21 index20 alt2"><code class="swift keyword">default</code><code class="swift plain">:</code></div>
<div class="line number22 index21 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"winter"</code><code class="swift plain">)</code></div>
<div class="line number23 index22 alt2"><code class="swift plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>事实上Swift中也可以指定一个值和枚举成员对应,就像其他语言一样(通常其他语言的枚举默认就是整形),但是Swift又不局限于整形,它可以是整形、浮点型、字符串、字符,但是原始值必须是一种固定类型而不能存储多个不同的类型,同时如果原始值为整形则会像其他语言一样默认会自动递增。</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_474550" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift comments">//指定原始值(这里定义成了整形)</code></div>
<div class="line number2 index1 alt1"><code class="swift keyword">enum</code> <code class="swift variable">Season</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">{</code></div>
<div class="line number3 index2 alt2"><code class="swift spaces"> </code><code class="swift keyword">case</code> <code class="swift variable">Spring</code><code class="swift plain">=</code><code class="swift value">10</code> <code class="swift comments">//其他值会默认递增,例如Summer默认为11,如果此处也不指定值会从0开始依次递增</code></div>
<div class="line number4 index3 alt1"><code class="swift spaces"> </code><code class="swift keyword">case</code> <code class="swift variable">Summer</code></div>
<div class="line number5 index4 alt2"><code class="swift spaces"> </code><code class="swift keyword">case</code> <code class="swift variable">Autumn</code></div>
<div class="line number6 index5 alt1"><code class="swift spaces"> </code><code class="swift keyword">case</code> <code class="swift variable">Winter</code></div>
<div class="line number7 index6 alt2"><code class="swift plain">}</code></div>
<div class="line number8 index7 alt1"> </div>
<div class="line number9 index8 alt2"><code class="swift keyword">var</code> <code class="swift variable">summer</code><code class="swift plain">=</code><code class="swift variable">Season</code><code class="swift plain">.</code><code class="swift variable">Summer</code></div>
<div class="line number10 index9 alt1"> </div>
<div class="line number11 index10 alt2"><code class="swift comments">//使用rawValue访问原始值</code></div>
<div class="line number12 index11 alt1"><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"summer=\(</code><code class="swift variable">summer</code><code class="swift string">),rawValue=\(</code><code class="swift variable">summer</code><code class="swift plain">.</code><code class="swift variable">rawValue</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number13 index12 alt2"> </div>
<div class="line number14 index13 alt1"><code class="swift comments">//通过原始值创建枚举类型,但是注意它是一个可选类型</code></div>
<div class="line number15 index14 alt2"><code class="swift keyword">var</code> <code class="swift variable">autumn</code><code class="swift plain">=</code><code class="swift variable">Season</code><code class="swift plain">(</code><code class="swift variable">rawValue</code><code class="swift plain">: </code><code class="swift value">12</code><code class="swift plain">)</code></div>
<div class="line number16 index15 alt1"> </div>
<div class="line number17 index16 alt2"><code class="swift comments">//可选类型绑定</code></div>
<div class="line number18 index17 alt1"><code class="swift keyword">if</code> <code class="swift keyword">let</code> <code class="swift variable">newAutumn</code><code class="swift plain">=</code><code class="swift variable">autumn</code><code class="swift plain">{</code></div>
<div class="line number19 index18 alt2"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"summer=\(</code><code class="swift variable">newAutumn</code><code class="swift string">),rawValue=\(</code><code class="swift variable">newAutumn</code><code class="swift plain">.</code><code class="swift variable">rawValue</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number20 index19 alt1"><code class="swift plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>如果一个枚举类型能够和一些其他类型的数据一起存储起来往往会很有用,因为这可以让你存储枚举类型之外的信息(类似于其他语言中对象的tag属性,但是又多了灵活性),这在其他语言几乎是不可能实现的,但是在Swift中却可以做到,这在Swift中称为枚举类型相关值。要注意的是相关值并不是原始值,原始值需要事先存储并且只能是同一种类型,但是相关值只有创建一个基于枚举的变量或者常量时才会指定,并且类型可以不同(原始值更像其他语言的枚举类型)。 </p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_48164" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift comments">//相关值</code></div>
<div class="line number2 index1 alt1"><code class="swift keyword">enum</code> <code class="swift variable">Color</code><code class="swift plain">{</code></div>
<div class="line number3 index2 alt2"><code class="swift spaces"> </code><code class="swift keyword">case</code> <code class="swift variable">RGB</code><code class="swift plain">(</code><code class="swift color2">String</code><code class="swift plain">) </code><code class="swift comments">//注意为了方便演示这里没有定义成三个Int类型(例如: RGB(Int,Int,Int))而使用16进制字符串形式</code></div>
<div class="line number4 index3 alt1"><code class="swift spaces"> </code><code class="swift keyword">case</code> <code class="swift variable">CMYK</code><code class="swift plain">(</code><code class="swift color2">Float</code><code class="swift plain">,</code><code class="swift color2">Float</code><code class="swift plain">,</code><code class="swift color2">Float</code><code class="swift plain">,</code><code class="swift color2">Float</code><code class="swift plain">)</code></div>
<div class="line number5 index4 alt2"><code class="swift spaces"> </code><code class="swift keyword">case</code> <code class="swift variable">HSB</code><code class="swift plain">(</code><code class="swift color2">Int</code><code class="swift plain">,</code><code class="swift color2">Int</code><code class="swift plain">,</code><code class="swift color2">Int</code><code class="swift plain">)</code></div>
<div class="line number6 index5 alt1"><code class="swift plain">}</code></div>
<div class="line number7 index6 alt2"> </div>
<div class="line number8 index7 alt1"><code class="swift keyword">var</code> <code class="swift variable">red</code><code class="swift plain">=</code><code class="swift variable">Color</code><code class="swift plain">.</code><code class="swift variable">RGB</code><code class="swift plain">(</code><code class="swift string">"#FF0000"</code><code class="swift plain">)</code></div>
<div class="line number9 index8 alt2"> </div>
<div class="line number10 index9 alt1"><code class="swift keyword">var</code> <code class="swift variable">green</code><code class="swift plain">=</code><code class="swift variable">Color</code><code class="swift plain">.</code><code class="swift variable">CMYK</code><code class="swift plain">(</code><code class="swift value">0.61</code><code class="swift plain">, </code><code class="swift value">0.0</code><code class="swift plain">, </code><code class="swift value">1.0</code><code class="swift plain">, </code><code class="swift value">0.0</code><code class="swift plain">)</code></div>
<div class="line number11 index10 alt2"> </div>
<div class="line number12 index11 alt1"><code class="swift keyword">var</code> <code class="swift variable">blue</code><code class="swift plain">=</code><code class="swift variable">Color</code><code class="swift plain">.</code><code class="swift variable">HSB</code><code class="swift plain">(</code><code class="swift value">240</code><code class="swift plain">, </code><code class="swift value">100</code><code class="swift plain">, </code><code class="swift value">100</code><code class="swift plain">)</code></div>
<div class="line number13 index12 alt2"> </div>
<div class="line number14 index13 alt1"><code class="swift keyword">switch</code> <code class="swift variable">red</code> <code class="swift plain">{</code></div>
<div class="line number15 index14 alt2"><code class="swift keyword">case</code> <code class="swift plain">.</code><code class="swift variable">RGB</code><code class="swift plain">(</code><code class="swift keyword">let</code> <code class="swift variable">colorStr</code><code class="swift plain">):</code></div>
<div class="line number16 index15 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"colorStr=\(</code><code class="swift variable">colorStr</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number17 index16 alt2"><code class="swift keyword">case</code> <code class="swift keyword">let</code> <code class="swift plain">.</code><code class="swift variable">CMYK</code><code class="swift plain">(</code><code class="swift color2">c</code><code class="swift plain">,</code><code class="swift variable">m</code><code class="swift plain">,</code><code class="swift variable">y</code><code class="swift plain">,</code><code class="swift variable">k</code><code class="swift plain">):</code></div>
<div class="line number18 index17 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"c=\(</code><code class="swift color2">c</code><code class="swift string">),m=\(</code><code class="swift variable">m</code><code class="swift string">),y=\(</code><code class="swift variable">y</code><code class="swift string">),k=\(</code><code class="swift variable">k</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number19 index18 alt2"><code class="swift keyword">case</code> <code class="swift keyword">let</code> <code class="swift plain">.</code><code class="swift variable">HSB</code><code class="swift plain">(</code><code class="swift variable">h</code><code class="swift plain">,</code><code class="swift variable">s</code><code class="swift plain">,</code><code class="swift variable">b</code><code class="swift plain">):</code></div>
<div class="line number20 index19 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"h=\(</code><code class="swift variable">h</code><code class="swift string">),s=\(</code><code class="swift variable">s</code><code class="swift string">),b=\(</code><code class="swift variable">b</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number21 index20 alt2"><code class="swift plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>上面提到其实枚举也有一些类型和结构体的特性,例如计算属性(包括类型属性,枚举只能定义计算属性不能定义存储属性,存储属性只能应用于类和结构体)、构造方法(其实上面使用原始值创建枚举的例子就是一个构造方法)、方法(实例方法、类型方法)、下标脚本 。</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_985564" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
<div class="line number38 index37 alt1">38</div>
<div class="line number39 index38 alt2">39</div>
<div class="line number40 index39 alt1">40</div>
<div class="line number41 index40 alt2">41</div>
<div class="line number42 index41 alt1">42</div>
<div class="line number43 index42 alt2">43</div>
<div class="line number44 index43 alt1">44</div>
<div class="line number45 index44 alt2">45</div>
<div class="line number46 index45 alt1">46</div>
<div class="line number47 index46 alt2">47</div>
<div class="line number48 index47 alt1">48</div>
<div class="line number49 index48 alt2">49</div>
<div class="line number50 index49 alt1">50</div>
<div class="line number51 index50 alt2">51</div>
<div class="line number52 index51 alt1">52</div>
<div class="line number53 index52 alt2">53</div>
<div class="line number54 index53 alt1">54</div>
<div class="line number55 index54 alt2">55</div>
<div class="line number56 index55 alt1">56</div>
<div class="line number57 index56 alt2">57</div>
<div class="line number58 index57 alt1">58</div>
<div class="line number59 index58 alt2">59</div>
<div class="line number60 index59 alt1">60</div>
<div class="line number61 index60 alt2">61</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift keyword">enum</code> <code class="swift variable">Season</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">{</code></div>
<div class="line number2 index1 alt1"><code class="swift spaces"> </code><code class="swift keyword">case</code> <code class="swift variable">Spring</code><code class="swift plain">=</code><code class="swift value">0</code> <code class="swift plain">,</code><code class="swift variable">Summer</code><code class="swift plain">,</code><code class="swift variable">Autumn</code><code class="swift plain">,</code><code class="swift variable">Winter</code></div>
<div class="line number3 index2 alt2"><code class="swift spaces"> </code> </div>
<div class="line number4 index3 alt1"><code class="swift spaces"> </code><code class="swift comments">//定义计算属性</code></div>
<div class="line number5 index4 alt2"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">tag</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">{</code></div>
<div class="line number6 index5 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">rawValue</code></div>
<div class="line number7 index6 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number8 index7 alt1"><code class="swift spaces"> </code><code class="swift comments">//类型属性</code></div>
<div class="line number9 index8 alt2"><code class="swift spaces"> </code><code class="swift keyword">static</code> <code class="swift keyword">var</code> <code class="swift variable">enumName</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">{</code></div>
<div class="line number10 index9 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift string">"Season"</code></div>
<div class="line number11 index10 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number12 index11 alt1"><code class="swift spaces"> </code> </div>
<div class="line number13 index12 alt2"><code class="swift comments">// //定义构造方法,注意在枚举的构造函数中则必须保证self有值(正如类的构造方法必须保证其存储属性有值一样)</code></div>
<div class="line number14 index13 alt1"><code class="swift comments">// init(prefix:String){</code></div>
<div class="line number15 index14 alt2"><code class="swift comments">// switch prefix.lowercaseString {</code></div>
<div class="line number16 index15 alt1"><code class="swift comments">// case "sp":</code></div>
<div class="line number17 index16 alt2"><code class="swift comments">// self = .Spring</code></div>
<div class="line number18 index17 alt1"><code class="swift comments">// case "su":</code></div>
<div class="line number19 index18 alt2"><code class="swift comments">// self = .Summer</code></div>
<div class="line number20 index19 alt1"><code class="swift comments">// case "au":</code></div>
<div class="line number21 index20 alt2"><code class="swift comments">// self = .Autumn</code></div>
<div class="line number22 index21 alt1"><code class="swift comments">// default:</code></div>
<div class="line number23 index22 alt2"><code class="swift comments">// self = .Winter</code></div>
<div class="line number24 index23 alt1"><code class="swift comments">// }</code></div>
<div class="line number25 index24 alt2"><code class="swift comments">// }</code></div>
<div class="line number26 index25 alt1"><code class="swift spaces"> </code><code class="swift comments">//其实上面的构造器有些不合理,那就是default就是Winter,事实上这类构造器可能传任何参数,此时可以使用可失败构造函数来解决</code></div>
<div class="line number27 index26 alt2"><code class="swift spaces"> </code><code class="swift comments">//可失败构造函数返回nil(尽管Swift中构造函数是不返回值的,但是此时约定返回nil代表构造失败)</code></div>
<div class="line number28 index27 alt1"><code class="swift spaces"> </code><code class="swift keyword">init</code><code class="swift plain">?(</code><code class="swift keyword">prefix</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">){</code></div>
<div class="line number29 index28 alt2"><code class="swift spaces"> </code><code class="swift keyword">switch</code> <code class="swift keyword">prefix</code><code class="swift plain">.</code><code class="swift variable">lowercaseString</code> <code class="swift plain">{</code></div>
<div class="line number30 index29 alt1"><code class="swift spaces"> </code><code class="swift keyword">case</code> <code class="swift string">"sp"</code><code class="swift plain">:</code></div>
<div class="line number31 index30 alt2"><code class="swift spaces"> </code><code class="swift keyword">self</code> <code class="swift plain">= .</code><code class="swift variable">Spring</code></div>
<div class="line number32 index31 alt1"><code class="swift spaces"> </code><code class="swift keyword">case</code> <code class="swift string">"su"</code><code class="swift plain">:</code></div>
<div class="line number33 index32 alt2"><code class="swift spaces"> </code><code class="swift keyword">self</code> <code class="swift plain">= .</code><code class="swift variable">Summer</code></div>
<div class="line number34 index33 alt1"><code class="swift spaces"> </code><code class="swift keyword">case</code> <code class="swift string">"au"</code><code class="swift plain">:</code></div>
<div class="line number35 index34 alt2"><code class="swift spaces"> </code><code class="swift keyword">self</code> <code class="swift plain">= .</code><code class="swift variable">Autumn</code></div>
<div class="line number36 index35 alt1"><code class="swift spaces"> </code><code class="swift keyword">case</code> <code class="swift string">"wi"</code><code class="swift plain">:</code></div>
<div class="line number37 index36 alt2"><code class="swift spaces"> </code><code class="swift keyword">self</code> <code class="swift plain">= .</code><code class="swift variable">Winter</code></div>
<div class="line number38 index37 alt1"><code class="swift spaces"> </code><code class="swift keyword">default</code><code class="swift plain">:</code></div>
<div class="line number39 index38 alt2"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift color2">nil</code></div>
<div class="line number40 index39 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number41 index40 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number42 index41 alt1"> </div>
<div class="line number43 index42 alt2"><code class="swift spaces"> </code><code class="swift comments">//定义实例方法</code></div>
<div class="line number44 index43 alt1"><code class="swift spaces"> </code><code class="swift keyword">func</code> <code class="swift variable">showMessage</code><code class="swift plain">(){</code></div>
<div class="line number45 index44 alt2"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"rowValue=\(</code><code class="swift keyword">self</code><code class="swift plain">.</code><code class="swift variable">rawValue</code><code class="swift string">)"</code><code class="swift plain">)</code></div>
<div class="line number46 index45 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number47 index46 alt2"><code class="swift spaces"> </code><code class="swift comments">//定义类型方法</code></div>
<div class="line number48 index47 alt1"><code class="swift spaces"> </code><code class="swift keyword">static</code> <code class="swift keyword">func</code> <code class="swift variable">showEnumName</code><code class="swift plain">(){</code></div>
<div class="line number49 index48 alt2"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"Enum name is \"Season\""</code><code class="swift plain">)</code></div>
<div class="line number50 index49 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number51 index50 alt2"><code class="swift plain">}</code></div>
<div class="line number52 index51 alt1"> </div>
<div class="line number53 index52 alt2"><code class="swift keyword">var</code> <code class="swift variable">summer</code><code class="swift plain">=</code><code class="swift variable">Season</code><code class="swift plain">.</code><code class="swift variable">Summer</code></div>
<div class="line number54 index53 alt1"><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift variable">summer</code><code class="swift plain">.</code><code class="swift variable">tag</code><code class="swift plain">) </code><code class="swift comments">//结果:1</code></div>
<div class="line number55 index54 alt2"><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift variable">Season</code><code class="swift plain">.</code><code class="swift variable">enumName</code><code class="swift plain">) </code><code class="swift comments">//结果:Season</code></div>
<div class="line number56 index55 alt1"><code class="swift variable">Season</code><code class="swift plain">.</code><code class="swift variable">showEnumName</code><code class="swift plain">() </code><code class="swift comments">//结果:Enum name is "Season"</code></div>
<div class="line number57 index56 alt2"><code class="swift variable">summer</code><code class="swift plain">.</code><code class="swift variable">showMessage</code><code class="swift plain">() </code><code class="swift comments">//结果:rowValue=1</code></div>
<div class="line number58 index57 alt1"> </div>
<div class="line number59 index58 alt2"><code class="swift keyword">if</code> <code class="swift keyword">let</code> <code class="swift variable">spring</code> <code class="swift plain">= </code><code class="swift variable">Season</code><code class="swift plain">(</code><code class="swift keyword">prefix</code><code class="swift plain">: </code><code class="swift string">"au"</code><code class="swift plain">) { </code><code class="swift comments">//可选绑定,构造函数返回值可能为nil</code></div>
<div class="line number60 index59 alt1"><code class="swift spaces"> </code><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift variable">spring</code><code class="swift plain">.</code><code class="swift variable">tag</code><code class="swift plain">) </code><code class="swift comments">//结果:2</code></div>
<div class="line number61 index60 alt2"><code class="swift plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p> </p>
<blockquote class="remark">
<p>之所以没有将枚举、结构体放到上面的数据类型部分介绍一方面Swift中的枚举、结构体和其他语言中有较大差别,另一方面是因为这个部分的介绍要用到前面的知识。</p>
</blockquote>
<h1 id="generic">泛型</h1>
<p>泛型可以让你根据需求使用一种抽象类型来完成代码定义,在使用时才真正知道其具体类型。这样一来就好像在定义时使用一个占位符做一个模板,实际调用时再进行模板套用,所以在C++中也称为“模板”。泛型在Swift中被广泛应用,上面介绍的Array<>、Dictionary<>事实上都是泛型的应用。通过下面的例子简单看一下泛型参数和泛型类型的使用。</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_525630" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
<div class="line number38 index37 alt1">38</div>
<div class="line number39 index38 alt2">39</div>
<div class="line number40 index39 alt1">40</div>
<div class="line number41 index40 alt2">41</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift comments">/*泛型参数*/</code></div>
<div class="line number2 index1 alt1"><code class="swift comments">//添加了约束条件的泛型(此时T必须实现Equatable协议)</code></div>
<div class="line number3 index2 alt2"><code class="swift keyword">func</code> <code class="swift variable">isEqual</code><code class="swift plain"><</code><code class="swift variable">T</code><code class="swift plain">:</code><code class="swift color2">Equatable</code><code class="swift plain">></code><code class="swift plain">(</code><code class="swift variable">a</code><code class="swift plain">:</code><code class="swift variable">T</code><code class="swift plain">,</code><code class="swift variable">b</code><code class="swift plain">:</code><code class="swift variable">T</code><code class="swift plain">)-</code><code class="swift plain">></code><code class="swift color2">Bool</code><code class="swift plain">{</code></div>
<div class="line number4 index3 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift variable">a</code> <code class="swift plain">== </code><code class="swift variable">b</code></div>
<div class="line number5 index4 alt2"><code class="swift plain">}</code></div>
<div class="line number6 index5 alt1"> </div>
<div class="line number7 index6 alt2"><code class="swift keyword">var</code> <code class="swift variable">a</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">=</code><code class="swift value">1</code><code class="swift plain">,</code><code class="swift variable">b</code><code class="swift plain">:</code><code class="swift color2">Int</code><code class="swift plain">=</code><code class="swift value">2</code></div>
<div class="line number8 index7 alt1"><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift variable">isEqual</code><code class="swift plain">(</code><code class="swift variable">a</code><code class="swift plain">,</code><code class="swift variable">b</code><code class="swift plain">)) </code><code class="swift comments">//结果:false</code></div>
<div class="line number9 index8 alt2"> </div>
<div class="line number10 index9 alt1"><code class="swift keyword">var</code> <code class="swift color2">c</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">=</code><code class="swift string">"abc"</code><code class="swift plain">,</code><code class="swift variable">d</code><code class="swift plain">:</code><code class="swift color2">String</code><code class="swift plain">=</code><code class="swift string">"abc"</code></div>
<div class="line number11 index10 alt2"><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift variable">isEqual</code><code class="swift plain">(</code><code class="swift color2">c</code><code class="swift plain">,</code><code class="swift variable">d</code><code class="swift plain">)) </code><code class="swift comments">//结果:true</code></div>
<div class="line number12 index11 alt1"> </div>
<div class="line number13 index12 alt2"><code class="swift comments">/*泛型类型*/</code></div>
<div class="line number14 index13 alt1"><code class="swift keyword">struct</code> <code class="swift variable">Stack</code><code class="swift plain"><</code><code class="swift variable">T</code><code class="swift plain">></code> <code class="swift plain">{</code></div>
<div class="line number15 index14 alt2"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">store</code><code class="swift plain">:[</code><code class="swift variable">T</code><code class="swift plain">]=[]</code></div>
<div class="line number16 index15 alt1"><code class="swift spaces"> </code> </div>
<div class="line number17 index16 alt2"><code class="swift spaces"> </code><code class="swift comments">//在结构体、枚举中修改其变量需要使用mutating修饰(注意类不需要)</code></div>
<div class="line number18 index17 alt1"><code class="swift spaces"> </code><code class="swift keyword">mutating</code> <code class="swift keyword">func</code> <code class="swift variable">push</code><code class="swift plain">(</code><code class="swift variable">item</code><code class="swift plain">:</code><code class="swift variable">T</code><code class="swift plain">){</code></div>
<div class="line number19 index18 alt2"><code class="swift spaces"> </code><code class="swift variable">store</code><code class="swift plain">.</code><code class="swift variable">append</code><code class="swift plain">(</code><code class="swift variable">item</code><code class="swift plain">)</code></div>
<div class="line number20 index19 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number21 index20 alt2"><code class="swift spaces"> </code> </div>
<div class="line number22 index21 alt1"><code class="swift spaces"> </code><code class="swift keyword">mutating</code> <code class="swift keyword">func</code> <code class="swift variable">pop</code><code class="swift plain">()-</code><code class="swift plain">></code><code class="swift variable">T</code><code class="swift plain">{</code></div>
<div class="line number23 index22 alt2"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift variable">store</code><code class="swift plain">.</code><code class="swift variable">removeLast</code><code class="swift plain">()</code></div>
<div class="line number24 index23 alt1"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number25 index24 alt2"><code class="swift plain">}</code></div>
<div class="line number26 index25 alt1"> </div>
<div class="line number27 index26 alt2"><code class="swift keyword">var</code> <code class="swift variable">s</code> <code class="swift plain">= </code><code class="swift variable">Stack</code><code class="swift plain"><</code><code class="swift color2">Int</code><code class="swift plain">></code><code class="swift plain">()</code></div>
<div class="line number28 index27 alt1"><code class="swift variable">s</code><code class="swift plain">.</code><code class="swift variable">push</code><code class="swift plain">(</code><code class="swift value">1</code><code class="swift plain">)</code></div>
<div class="line number29 index28 alt2"><code class="swift keyword">let</code> <code class="swift variable">t</code> <code class="swift plain">= </code><code class="swift variable">s</code><code class="swift plain">.</code><code class="swift variable">pop</code><code class="swift plain">()</code></div>
<div class="line number30 index29 alt1"><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"t=\(</code><code class="swift variable">t</code><code class="swift string">)"</code><code class="swift plain">) </code><code class="swift comments">//结果:t=1</code></div>
<div class="line number31 index30 alt2"> </div>
<div class="line number32 index31 alt1"> </div>
<div class="line number33 index32 alt2"><code class="swift comments">//扩展泛型类型</code></div>
<div class="line number34 index33 alt1"><code class="swift keyword">extension</code> <code class="swift variable">Stack</code><code class="swift plain">{</code></div>
<div class="line number35 index34 alt2"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">top</code><code class="swift plain">:</code><code class="swift variable">T</code><code class="swift plain">?{</code></div>
<div class="line number36 index35 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift variable">store</code><code class="swift plain">.</code><code class="swift variable">last</code></div>
<div class="line number37 index36 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number38 index37 alt1"><code class="swift plain">}</code></div>
<div class="line number39 index38 alt2"> </div>
<div class="line number40 index39 alt1"><code class="swift variable">s</code><code class="swift plain">.</code><code class="swift variable">push</code><code class="swift plain">(</code><code class="swift value">2</code><code class="swift plain">)</code></div>
<div class="line number41 index40 alt2"><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift variable">s</code><code class="swift plain">.</code><code class="swift variable">top</code><code class="swift plain">!) </code><code class="swift comments">//结果:2</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>上面演示了泛型结构体用法,其实类同样是类似的,这里就不在赘述了,但是如果遇到泛型协议怎么办呢?假设Stack必须遵循一个Stackable协议,此时就必须在协议中引入一个关联类型来解决。 </p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_655028" class="syntaxhighlighterswift">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="swift keyword">protocol</code> <code class="swift variable">Stackable</code><code class="swift plain">{</code></div>
<div class="line number2 index1 alt1"><code class="swift spaces"> </code><code class="swift comments">//声明一个关联类型</code></div>
<div class="line number3 index2 alt2"><code class="swift spaces"> </code><code class="swift keyword">typealias</code> <code class="swift variable">ItemType</code></div>
<div class="line number4 index3 alt1"><code class="swift spaces"> </code><code class="swift keyword">mutating</code> <code class="swift keyword">func</code> <code class="swift variable">push</code><code class="swift plain">(</code><code class="swift variable">item</code><code class="swift plain">:</code><code class="swift variable">ItemType</code><code class="swift plain">)</code></div>
<div class="line number5 index4 alt2"><code class="swift spaces"> </code><code class="swift keyword">mutating</code> <code class="swift keyword">func</code> <code class="swift variable">pop</code><code class="swift plain">()-</code><code class="swift plain">></code><code class="swift variable">ItemType</code><code class="swift plain">;</code></div>
<div class="line number6 index5 alt1"><code class="swift plain">}</code></div>
<div class="line number7 index6 alt2"> </div>
<div class="line number8 index7 alt1"><code class="swift keyword">struct</code> <code class="swift variable">Stack</code><code class="swift plain">:</code><code class="swift variable">Stackable</code><code class="swift plain">{</code></div>
<div class="line number9 index8 alt2"><code class="swift spaces"> </code><code class="swift keyword">var</code> <code class="swift variable">store</code><code class="swift plain">:[</code><code class="swift variable">T</code><code class="swift plain">]=[]</code></div>
<div class="line number10 index9 alt1"><code class="swift spaces"> </code> </div>
<div class="line number11 index10 alt2"><code class="swift spaces"> </code><code class="swift keyword">mutating</code> <code class="swift keyword">func</code> <code class="swift variable">push</code><code class="swift plain">(</code><code class="swift variable">item</code><code class="swift plain">:</code><code class="swift variable">T</code><code class="swift plain">){</code></div>
<div class="line number12 index11 alt1"><code class="swift spaces"> </code><code class="swift variable">store</code><code class="swift plain">.</code><code class="swift variable">append</code><code class="swift plain">(</code><code class="swift variable">item</code><code class="swift plain">)</code></div>
<div class="line number13 index12 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number14 index13 alt1"><code class="swift spaces"> </code> </div>
<div class="line number15 index14 alt2"><code class="swift spaces"> </code><code class="swift keyword">mutating</code> <code class="swift keyword">func</code> <code class="swift variable">pop</code><code class="swift plain">()-</code><code class="swift plain">></code><code class="swift variable">T</code><code class="swift plain">{</code></div>
<div class="line number16 index15 alt1"><code class="swift spaces"> </code><code class="swift keyword">return</code> <code class="swift variable">store</code><code class="swift plain">.</code><code class="swift variable">removeLast</code><code class="swift plain">()</code></div>
<div class="line number17 index16 alt2"><code class="swift spaces"> </code><code class="swift plain">}</code></div>
<div class="line number18 index17 alt1"><code class="swift plain">}</code></div>
<div class="line number19 index18 alt2"> </div>
<div class="line number20 index19 alt1"><code class="swift keyword">var</code> <code class="swift variable">s</code> <code class="swift plain">= </code><code class="swift variable">Stack</code><code class="swift plain">()</code></div>
<div class="line number21 index20 alt2"><code class="swift variable">s</code><code class="swift plain">.</code><code class="swift variable">push</code><code class="swift plain">(</code><code class="swift string">"hello"</code><code class="swift plain">)</code></div>
<div class="line number22 index21 alt1"><code class="swift variable">s</code><code class="swift plain">.</code><code class="swift variable">push</code><code class="swift plain">(</code><code class="swift string">"world"</code><code class="swift plain">)</code></div>
<div class="line number23 index22 alt2"><code class="swift keyword">let</code> <code class="swift variable">t</code> <code class="swift plain">= </code><code class="swift variable">s</code><code class="swift plain">.</code><code class="swift variable">pop</code><code class="swift plain">()</code></div>
<div class="line number24 index23 alt1"><code class="swift color2">println</code><code class="swift plain">(</code><code class="swift string">"t=\(</code><code class="swift variable">t</code><code class="swift string">)"</code><code class="swift plain">) </code><code class="swift comments">//结果:t=world</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div><br><br>
来源:https://www.cnblogs.com/wangjiadashao/p/17376720.html
頁:
[1]