make gitbook
This commit is contained in:
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="1.1" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="1.1" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
@ -587,7 +587,7 @@
|
|||||||
|
|
||||||
<div class="page-inner">
|
<div class="page-inner">
|
||||||
|
|
||||||
<section class="normal" id="section-gitbook_4">
|
<section class="normal" id="section-gitbook_6">
|
||||||
|
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p>翻译:<a href="https://github.com/numbbbbb" target="_blank">numbbbbb</a><br>校对:<a href="https://github.com/yeahdongcn" target="_blank">yeahdongcn</a></p>
|
<p>翻译:<a href="https://github.com/numbbbbb" target="_blank">numbbbbb</a><br>校对:<a href="https://github.com/yeahdongcn" target="_blank">yeahdongcn</a></p>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="1.2" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="1.2" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
@ -587,7 +587,7 @@
|
|||||||
|
|
||||||
<div class="page-inner">
|
<div class="page-inner">
|
||||||
|
|
||||||
<section class="normal" id="section-gitbook_6">
|
<section class="normal" id="section-gitbook_4">
|
||||||
|
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p>翻译:<a href="https://github.com/numbbbbb" target="_blank">numbbbbb</a><br>校对:<a href="https://github.com/shinyzhu" target="_blank">shinyzhu</a>, <a href="https://github.com/stanzhai" target="_blank">stanzhai</a></p>
|
<p>翻译:<a href="https://github.com/numbbbbb" target="_blank">numbbbbb</a><br>校对:<a href="https://github.com/shinyzhu" target="_blank">shinyzhu</a>, <a href="https://github.com/stanzhai" target="_blank">stanzhai</a></p>
|
||||||
@ -610,7 +610,8 @@
|
|||||||
<p>如果你写过 C 或者 Objective-C 代码,那你应该很熟悉这种形式——在 Swift 中,这行代码就是一个完整的程序。你不需要为了输入输出或者字符串处理导入一个单独的库。全局作用域中的代码会被自动当做程序的入口点,所以你也不需要<code>main</code>函数。你同样不需要在每个语句结尾写上分号。</p>
|
<p>如果你写过 C 或者 Objective-C 代码,那你应该很熟悉这种形式——在 Swift 中,这行代码就是一个完整的程序。你不需要为了输入输出或者字符串处理导入一个单独的库。全局作用域中的代码会被自动当做程序的入口点,所以你也不需要<code>main</code>函数。你同样不需要在每个语句结尾写上分号。</p>
|
||||||
<p>这个教程会通过一系列编程例子来让你对 Swift 有初步了解,如果你有什么不理解的地方也不用担心——任何本章介绍的内容都会在后面的章节中详细讲解。</p>
|
<p>这个教程会通过一系列编程例子来让你对 Swift 有初步了解,如果你有什么不理解的地方也不用担心——任何本章介绍的内容都会在后面的章节中详细讲解。</p>
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p>注意:<br>为了获得最好的体验,在 Xcode 当中使用代码预览功能。代码预览功能可以让你编辑代码并实时看到运行结果。</p>
|
<p>注意:<br>为了获得最好的体验,在 Xcode 当中使用代码预览功能。代码预览功能可以让你编辑代码并实时看到运行结果。
|
||||||
|
<a href="https://github.com/Tairraos/the-swift-programming-language-in-chinese/blob/gh-pages/chapter1/GuidedTour.playground.zip?raw=true">打开Playground</a></p>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
<p><a name="simple_values"></a></p>
|
<p><a name="simple_values"></a></p>
|
||||||
<h2 id="-">简单值</h2>
|
<h2 id="-">简单值</h2>
|
||||||
@ -829,7 +830,7 @@ hasAnyMatches(numbers, lessThanTen)
|
|||||||
})
|
})
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p>练习:<br>重写闭包,对所有奇数返回 0.</p>
|
<p>练习:<br>重写闭包,对所有奇数返回0。</p>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
<p>有很多种创建闭包的方法。如果一个闭包的类型已知,比如作为一个回调函数,你可以忽略参数的类型和返回值。单个语句闭包会把它语句的值当做结果返回。</p>
|
<p>有很多种创建闭包的方法。如果一个闭包的类型已知,比如作为一个回调函数,你可以忽略参数的类型和返回值。单个语句闭包会把它语句的值当做结果返回。</p>
|
||||||
<pre><code class="lang-swift">numbers.map({ number in 3 * number })
|
<pre><code class="lang-swift">numbers.map({ number in 3 * number })
|
||||||
@ -1096,8 +1097,7 @@ b.adjust()
|
|||||||
let bDescription = b.simpleDescription
|
let bDescription = b.simpleDescription
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p>练习:</p>
|
<p>练习:<br>写一个实现这个协议的枚举。</p>
|
||||||
<p>写一个实现这个协议的枚举。</p>
|
|
||||||
</blockquote>
|
</blockquote>
|
||||||
<p>注意声明<code>SimpleStructure</code>时候<code>mutating</code>关键字用来标记一个会修改结构体的方法。<code>SimpleClass</code>的声明不需要标记任何方法因为类中的方法经常会修改类。</p>
|
<p>注意声明<code>SimpleStructure</code>时候<code>mutating</code>关键字用来标记一个会修改结构体的方法。<code>SimpleClass</code>的声明不需要标记任何方法因为类中的方法经常会修改类。</p>
|
||||||
<p>使用<code>extension</code>来为现有的类型添加功能,比如新的方法和参数。你可以使用扩展来改造定义在别处,甚至是从外部库或者框架引入的一个类型,使得这个类型遵循某个协议。</p>
|
<p>使用<code>extension</code>来为现有的类型添加功能,比如新的方法和参数。你可以使用扩展来改造定义在别处,甚至是从外部库或者框架引入的一个类型,使得这个类型遵循某个协议。</p>
|
||||||
@ -1112,8 +1112,7 @@ let bDescription = b.simpleDescription
|
|||||||
7.simpleDescription
|
7.simpleDescription
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p>练习:</p>
|
<p>练习:<br>给<code>Double</code>类型写一个扩展,添加<code>absoluteValue</code>功能。</p>
|
||||||
<p>给<code>Double</code>类型写一个扩展,添加<code>absoluteValue</code>功能。</p>
|
|
||||||
</blockquote>
|
</blockquote>
|
||||||
<p>你可以像使用其他命名类型一样使用协议名——例如,创建一个有不同类型但是都实现一个协议的对象集合。当你处理类型是协议的值时,协议外定义的方法不可用。</p>
|
<p>你可以像使用其他命名类型一样使用协议名——例如,创建一个有不同类型但是都实现一个协议的对象集合。当你处理类型是协议的值时,协议外定义的方法不可用。</p>
|
||||||
<pre><code class="lang-swift">let protocolValue: ExampleProtocol = a
|
<pre><code class="lang-swift">let protocolValue: ExampleProtocol = a
|
||||||
|
|||||||
BIN
chapter1/GuidedTour.playground.zip
Normal file
BIN
chapter1/GuidedTour.playground.zip
Normal file
Binary file not shown.
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="1" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="1" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="2.1" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="2.1" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
@ -731,8 +731,7 @@ let maxValue = UInt8.max // maxValue 为 255,是 UInt8 类型的最大值
|
|||||||
<li>在64位平台上,<code>UInt</code>和<code>UInt64</code>长度相同。</li>
|
<li>在64位平台上,<code>UInt</code>和<code>UInt64</code>长度相同。</li>
|
||||||
</ul>
|
</ul>
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p>注意:</p>
|
<p>注意:<br>尽量不要使用<code>UInt</code>,除非你真的需要存储一个和当前平台原生字长相同的无符号整数。除了这种情况,最好使用<code>Int</code>,即使你要存储的值已知是非负的。统一使用<code>Int</code>可以提高代码的可复用性,避免不同类型数字之间的转换,并且匹配数字的类型推断,请参考<a href="#type_safety_and_type_inference">类型安全和类型推断</a>。</p>
|
||||||
<p>尽量不要使用<code>UInt</code>,除非你真的需要存储一个和当前平台原生字长相同的无符号整数。除了这种情况,最好使用<code>Int</code>,即使你要存储的值已知是非负的。统一使用<code>Int</code>可以提高代码的可复用性,避免不同类型数字之间的转换,并且匹配数字的类型推断,请参考<a href="#type_safety_and_type_inference">类型安全和类型推断</a>。</p>
|
|
||||||
</blockquote>
|
</blockquote>
|
||||||
<p><a name="floating-point_numbers"></a></p>
|
<p><a name="floating-point_numbers"></a></p>
|
||||||
<h2 id="-">浮点数</h2>
|
<h2 id="-">浮点数</h2>
|
||||||
@ -929,8 +928,7 @@ println("The status message is \(http200Status.description)")
|
|||||||
<li><em>没有</em>值</li>
|
<li><em>没有</em>值</li>
|
||||||
</ul>
|
</ul>
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p>注意:</p>
|
<p>注意:<br>C 和 Objective-C 中并没有可选类型这个概念。最接近的是 Objective-C 中的一个特性,一个方法要不返回一个对象要不返回<code>nil</code>,<code>nil</code>表示“缺少一个合法的对象”。然而,这只对对象起作用——对于结构体,基本的 C 类型或者枚举类型不起作用。对于这些类型,Objective-C 方法一般会返回一个特殊值(比如<code>NSNotFound</code>)来暗示值缺失。这种方法假设方法的调用者知道并记得对特殊值进行判断。然而,Swift 的可选类型可以让你暗示<em>任意类型</em>的值缺失,并不需要一个特殊值。</p>
|
||||||
<p>C 和 Objective-C 中并没有可选类型这个概念。最接近的是 Objective-C 中的一个特性,一个方法要不返回一个对象要不返回<code>nil</code>,<code>nil</code>表示“缺少一个合法的对象”。然而,这只对对象起作用——对于结构体,基本的 C 类型或者枚举类型不起作用。对于这些类型,Objective-C 方法一般会返回一个特殊值(比如<code>NSNotFound</code>)来暗示值缺失。这种方法假设方法的调用者知道并记得对特殊值进行判断。然而,Swift 的可选类型可以让你暗示<em>任意类型</em>的值缺失,并不需要一个特殊值。</p>
|
|
||||||
</blockquote>
|
</blockquote>
|
||||||
<p>来看一个例子。Swift 的<code>String</code>类型有一个叫做<code>toInt</code>的方法,作用是将一个<code>String</code>值转换成一个<code>Int</code>值。然而,并不是所有的字符串都可以转换成一个整数。字符串<code>"123"</code>可以被转换成数字<code>123</code>,但是字符串<code>"hello, world"</code>不行。</p>
|
<p>来看一个例子。Swift 的<code>String</code>类型有一个叫做<code>toInt</code>的方法,作用是将一个<code>String</code>值转换成一个<code>Int</code>值。然而,并不是所有的字符串都可以转换成一个整数。字符串<code>"123"</code>可以被转换成数字<code>123</code>,但是字符串<code>"hello, world"</code>不行。</p>
|
||||||
<p>下面的例子使用<code>toInt</code>方法来尝试将一个<code>String</code>转换成<code>Int</code>:</p>
|
<p>下面的例子使用<code>toInt</code>方法来尝试将一个<code>String</code>转换成<code>Int</code>:</p>
|
||||||
@ -988,8 +986,7 @@ serverResponseCode = nil
|
|||||||
// surveyAnswer 被自动设置为 nil
|
// surveyAnswer 被自动设置为 nil
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p>注意:</p>
|
<p>注意:<br>Swift 的<code>nil</code>和 Objective-C 中的<code>nil</code>并不一样。在 Objective-C 中,<code>nil</code>是一个指向不存在对象的指针。在 Swift 中,<code>nil</code>不是指针——它是一个确定的值,用来表示值缺失。<em>任何</em>类型的可选状态都可以被设置为<code>nil</code>,不只是对象类型。</p>
|
||||||
<p>Swift 的<code>nil</code>和 Objective-C 中的<code>nil</code>并不一样。在 Objective-C 中,<code>nil</code>是一个指向不存在对象的指针。在 Swift 中,<code>nil</code>不是指针——它是一个确定的值,用来表示值缺失。<em>任何</em>类型的可选状态都可以被设置为<code>nil</code>,不只是对象类型。</p>
|
|
||||||
</blockquote>
|
</blockquote>
|
||||||
<h3 id="-">隐式解析可选类型</h3>
|
<h3 id="-">隐式解析可选类型</h3>
|
||||||
<p>如上所述,可选类型暗示了常量或者变量可以“没有值”。可选可以通过<code>if</code>语句来判断是否有值,如果有值的话可以通过可选绑定来解析值。</p>
|
<p>如上所述,可选类型暗示了常量或者变量可以“没有值”。可选可以通过<code>if</code>语句来判断是否有值,如果有值的话可以通过可选绑定来解析值。</p>
|
||||||
@ -1007,8 +1004,7 @@ println(assumedString) // 不需要感叹号
|
|||||||
</code></pre>
|
</code></pre>
|
||||||
<p>你可以把隐式解析可选类型当做一个可以自动解析的可选类型。你要做的只是声明的时候把感叹号放到类型的结尾,而不是每次取值的可选名字的结尾。</p>
|
<p>你可以把隐式解析可选类型当做一个可以自动解析的可选类型。你要做的只是声明的时候把感叹号放到类型的结尾,而不是每次取值的可选名字的结尾。</p>
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p>注意:</p>
|
<p>注意:<br>如果你在隐式解析可选类型没有值的时候尝试取值,会触发运行时错误。和你在没有值的普通可选类型后面加一个惊叹号一样。</p>
|
||||||
<p>如果你在隐式解析可选类型没有值的时候尝试取值,会触发运行时错误。和你在没有值的普通可选类型后面加一个惊叹号一样。</p>
|
|
||||||
</blockquote>
|
</blockquote>
|
||||||
<p>你仍然可以把隐式解析可选类型当做普通可选类型来判断它是否包含值:</p>
|
<p>你仍然可以把隐式解析可选类型当做普通可选类型来判断它是否包含值:</p>
|
||||||
<pre><code class="lang-swift">if assumedString {
|
<pre><code class="lang-swift">if assumedString {
|
||||||
@ -1023,8 +1019,7 @@ println(assumedString) // 不需要感叹号
|
|||||||
// 输出 "An implicitly unwrapped optional string."
|
// 输出 "An implicitly unwrapped optional string."
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p>注意:</p>
|
<p>注意:<br>如果一个变量之后可能变成<code>nil</code>的话请不要使用隐式解析可选类型。如果你需要在变量的生命周期中判断是否是<code>nil</code>的话,请使用普通可选类型。</p>
|
||||||
<p>如果一个变量之后可能变成<code>nil</code>的话请不要使用隐式解析可选类型。如果你需要在变量的生命周期中判断是否是<code>nil</code>的话,请使用普通可选类型。</p>
|
|
||||||
</blockquote>
|
</blockquote>
|
||||||
<p><a name="assertions"></a></p>
|
<p><a name="assertions"></a></p>
|
||||||
<h2 id="-">断言</h2>
|
<h2 id="-">断言</h2>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="2.2" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="2.2" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="2.3" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="2.3" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="2.4" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="2.4" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="2.5" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="2.5" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="2.6" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="2.6" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
@ -602,7 +602,7 @@
|
|||||||
<li><a href="#Function_Types">函数类型(Function Types)</a></li>
|
<li><a href="#Function_Types">函数类型(Function Types)</a></li>
|
||||||
<li><a href="#Nested_Functions">函数嵌套(Nested Functions)</a></li>
|
<li><a href="#Nested_Functions">函数嵌套(Nested Functions)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>函数是用来完成特定任务的独立的代码块。你给一个函数起一个合适的名字,用来标示函数做什么,并且当函数需要执行的时候,这个名字会被“调用”。</p>
|
<p>函数是用来完成特定任务的独立的代码块。你给一个函数起一个合适的名字,用来标识函数做什么,并且当函数需要执行的时候,这个名字会被“调用”。</p>
|
||||||
<p>Swift 统一的函数语法足够灵活,可以用来表示任何函数,包括从最简单的没有参数名字的 C 风格函数,到复杂的带局部和外部参数名的 Objective-C 风格函数。参数可以提供默认值,以简化函数调用。参数也可以既当做传入参数,也当做传出参数,也就是说,一旦函数执行结束,传入的参数值可以被修改。</p>
|
<p>Swift 统一的函数语法足够灵活,可以用来表示任何函数,包括从最简单的没有参数名字的 C 风格函数,到复杂的带局部和外部参数名的 Objective-C 风格函数。参数可以提供默认值,以简化函数调用。参数也可以既当做传入参数,也当做传出参数,也就是说,一旦函数执行结束,传入的参数值可以被修改。</p>
|
||||||
<p>在 Swift 中,每个函数都有一种类型,包括函数的参数值类型和返回值类型。你可以把函数类型当做任何其他普通变量类型一样处理,这样就可以更简单地把函数当做别的函数的参数,也可以从其他函数中返回函数。函数的定义可以写在在其他函数定义中,这样可以在嵌套函数范围内实现功能封装。</p>
|
<p>在 Swift 中,每个函数都有一种类型,包括函数的参数值类型和返回值类型。你可以把函数类型当做任何其他普通变量类型一样处理,这样就可以更简单地把函数当做别的函数的参数,也可以从其他函数中返回函数。函数的定义可以写在在其他函数定义中,这样可以在嵌套函数范围内实现功能封装。</p>
|
||||||
<p><a name="Defining_and_Calling_Functions"></a></p>
|
<p><a name="Defining_and_Calling_Functions"></a></p>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="2.7" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="2.7" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="2.8" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="2.8" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
@ -598,12 +598,12 @@
|
|||||||
<ul>
|
<ul>
|
||||||
<li><a href="#enumeration_syntax">枚举语法(Enumeration Syntax)</a></li>
|
<li><a href="#enumeration_syntax">枚举语法(Enumeration Syntax)</a></li>
|
||||||
<li><a href="#matching_enumeration_values_with_a_switch_statement">匹配枚举值与<code>Swith</code>语句(Matching Enumeration Values with a Switch Statement)</a></li>
|
<li><a href="#matching_enumeration_values_with_a_switch_statement">匹配枚举值与<code>Swith</code>语句(Matching Enumeration Values with a Switch Statement)</a></li>
|
||||||
<li><a href="#associated_values">实例值(Associated Values)</a></li>
|
<li><a href="#associated_values">相关值(Associated Values)</a></li>
|
||||||
<li><a href="#raw_values">原始值(Raw Values)</a></li>
|
<li><a href="#raw_values">原始值(Raw Values)</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>枚举定义了一个通用类型的一组相关的值,使你可以在你的代码中以一个安全的方式来使用这些值。</p>
|
<p>枚举定义了一个通用类型的一组相关的值,使你可以在你的代码中以一个安全的方式来使用这些值。</p>
|
||||||
<p>如果你熟悉 C 语言,你就会知道,在 C 语言中枚举指定相关名称为一组整型值。Swift 中的枚举更加灵活,不必给每一个枚举成员提供一个值。如果一个值(被认为是“原始”值)被提供给每个枚举成员,则该值可以是一个字符串,一个字符,或是一个整型值或浮点值。</p>
|
<p>如果你熟悉 C 语言,你就会知道,在 C 语言中枚举指定相关名称为一组整型值。Swift 中的枚举更加灵活,不必给每一个枚举成员提供一个值。如果一个值(被认为是“原始”值)被提供给每个枚举成员,则该值可以是一个字符串,一个字符,或是一个整型值或浮点值。</p>
|
||||||
<p>此外,枚举成员可以指定任何类型的实例值存储到枚举成员值中,就像其他语言中的联合体(unions)和变体(variants)。你可以定义一组通用的相关成员作为枚举的一部分,每一组都有不同的一组与它相关的适当类型的数值。</p>
|
<p>此外,枚举成员可以指定任何类型的相关值存储到枚举成员值中,就像其他语言中的联合体(unions)和变体(variants)。你可以定义一组通用的相关成员作为枚举的一部分,每一组都有不同的一组与它相关的适当类型的数值。</p>
|
||||||
<p>在 Swift 中,枚举类型是一等(first-class)类型。它们采用了很多传统上只被类(class)所支持的特征,例如计算型属性(computed properties),用于提供关于枚举当前值的附加信息, 实例方法(instance methods),用于提供和枚举所代表的值相关联的功能。枚举也可以定义构造函数(initializers)来提供一个初始成员值;可以在原始的实现基础上扩展它们的功能;可以遵守协议(protocols)来提供标准的功能。</p>
|
<p>在 Swift 中,枚举类型是一等(first-class)类型。它们采用了很多传统上只被类(class)所支持的特征,例如计算型属性(computed properties),用于提供关于枚举当前值的附加信息, 实例方法(instance methods),用于提供和枚举所代表的值相关联的功能。枚举也可以定义构造函数(initializers)来提供一个初始成员值;可以在原始的实现基础上扩展它们的功能;可以遵守协议(protocols)来提供标准的功能。</p>
|
||||||
<p>欲了解更多相关功能,请参见<a href="10_Properties.html">属性(Properties)</a>,<a href="11_Methods.html">方法(Methods)</a>,<a href="14_Initialization.html">构造过程(Initialization)</a>,<a href="20_Extensions.html">扩展(Extensions)</a>和<a href="21_Protocols.html">协议(Protocols)</a>。</p>
|
<p>欲了解更多相关功能,请参见<a href="10_Properties.html">属性(Properties)</a>,<a href="11_Methods.html">方法(Methods)</a>,<a href="14_Initialization.html">构造过程(Initialization)</a>,<a href="20_Extensions.html">扩展(Extensions)</a>和<a href="21_Protocols.html">协议(Protocols)</a>。</p>
|
||||||
<p><a name="enumeration_syntax"></a></p>
|
<p><a name="enumeration_syntax"></a></p>
|
||||||
@ -668,9 +668,9 @@ default:
|
|||||||
// 输出 "Mostly harmless”
|
// 输出 "Mostly harmless”
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p><a name="associated_values"></a></p>
|
<p><a name="associated_values"></a></p>
|
||||||
<h2 id="-associated-values-">实例值(Associated Values)</h2>
|
<h2 id="-associated-values-">相关值(Associated Values)</h2>
|
||||||
<p>上一小节的例子演示了一个枚举的成员是如何被定义(分类)的。你可以为<code>Planet.Earth</code>设置一个常量或则变量,并且在之后查看这个值。然而,有时候会很有用如果能够把其他类型的实例值和成员值一起存储起来。这能让你随着成员值存储额外的自定义信息,并且当每次你在代码中利用该成员时允许这个信息产生变化。</p>
|
<p>上一小节的例子演示了一个枚举的成员是如何被定义(分类)的。你可以为<code>Planet.Earth</code>设置一个常量或则变量,并且在之后查看这个值。然而,有时候会很有用如果能够把其他类型的相关值和成员值一起存储起来。这能让你存储成员值之外的自定义信息,并且当你每次在代码中使用该成员时允许这个信息产生变化。</p>
|
||||||
<p>你可以定义 Swift 的枚举存储任何类型的实例值,如果需要的话,每个成员的数据类型可以是各不相同的。枚举的这种特性跟其他语言中的可辨识联合(discriminated unions),标签联合(tagged unions),或者变体(variants)相似。</p>
|
<p>你可以定义 Swift 的枚举存储任何类型的相关值,如果需要的话,每个成员的数据类型可以是各不相同的。枚举的这种特性跟其他语言中的可辨识联合(discriminated unions),标签联合(tagged unions),或者变体(variants)相似。</p>
|
||||||
<p>例如,假设一个库存跟踪系统需要利用两种不同类型的条形码来跟踪商品。有些商品上标有 UPC-A 格式的一维码,它使用数字 0 到 9。每一个条形码都有一个代表“数字系统”的数字,该数字后接 10 个代表“标识符”的数字。最后一个数字是“检查”位,用来验证代码是否被正确扫描:</p>
|
<p>例如,假设一个库存跟踪系统需要利用两种不同类型的条形码来跟踪商品。有些商品上标有 UPC-A 格式的一维码,它使用数字 0 到 9。每一个条形码都有一个代表“数字系统”的数字,该数字后接 10 个代表“标识符”的数字。最后一个数字是“检查”位,用来验证代码是否被正确扫描:</p>
|
||||||
<p><img width="252" height="120" alt="" src="https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Art/barcode_UPC_2x.png"></p>
|
<p><img width="252" height="120" alt="" src="https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Art/barcode_UPC_2x.png"></p>
|
||||||
<p>其他商品上标有 QR 码格式的二维码,它可以使用任何 ISO8859-1 字符,并且可以编码一个最多拥有 2,953 字符的字符串:</p>
|
<p>其他商品上标有 QR 码格式的二维码,它可以使用任何 ISO8859-1 字符,并且可以编码一个最多拥有 2,953 字符的字符串:</p>
|
||||||
@ -683,17 +683,17 @@ default:
|
|||||||
}
|
}
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>以上代码可以这么理解:</p>
|
<p>以上代码可以这么理解:</p>
|
||||||
<p>“定义一个名为<code>Barcode</code>的枚举类型,它可以是<code>UPCA</code>的一个实例值(<code>Int</code>,<code>Int</code>,<code>Int</code>),或者<code>QRCode</code>的一个字符串类型(<code>String</code>)实例值。”</p>
|
<p>“定义一个名为<code>Barcode</code>的枚举类型,它可以是<code>UPCA</code>的一个相关值(<code>Int</code>,<code>Int</code>,<code>Int</code>),或者<code>QRCode</code>的一个字符串类型(<code>String</code>)相关值。”</p>
|
||||||
<p>这个定义不提供任何<code>Int</code>或<code>String</code>的实际值,它只是定义了,当<code>Barcode</code>常量和变量等于<code>Barcode.UPCA</code>或<code>Barcode.QRCode</code>时,实例值的类型。</p>
|
<p>这个定义不提供任何<code>Int</code>或<code>String</code>的实际值,它只是定义了,当<code>Barcode</code>常量和变量等于<code>Barcode.UPCA</code>或<code>Barcode.QRCode</code>时,相关值的类型。</p>
|
||||||
<p>然后可以使用任何一种条码类型创建新的条码,如:</p>
|
<p>然后可以使用任何一种条码类型创建新的条码,如:</p>
|
||||||
<pre><code class="lang-swift">var productBarcode = Barcode.UPCA(8, 85909_51226, 3)
|
<pre><code class="lang-swift">var productBarcode = Barcode.UPCA(8, 85909_51226, 3)
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>以上例子创建了一个名为<code>productBarcode</code>的新变量,并且赋给它一个<code>Barcode.UPCA</code>的实例元组值<code>(8, 8590951226, 3)</code>。提供的“标识符”值在整数字中有一个下划线,使其便于阅读条形码。</p>
|
<p>以上例子创建了一个名为<code>productBarcode</code>的新变量,并且赋给它一个<code>Barcode.UPCA</code>的相关元组值<code>(8, 8590951226, 3)</code>。提供的“标识符”值在整数字中有一个下划线,使其便于阅读条形码。</p>
|
||||||
<p>同一个商品可以被分配给一个不同类型的条形码,如:</p>
|
<p>同一个商品可以被分配给一个不同类型的条形码,如:</p>
|
||||||
<pre><code class="lang-swift">productBarcode = .QRCode("ABCDEFGHIJKLMNOP")
|
<pre><code class="lang-swift">productBarcode = .QRCode("ABCDEFGHIJKLMNOP")
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>这时,原始的<code>Barcode.UPCA</code>和其整数值被新的<code>Barcode.QRCode</code>和其字符串值所替代。条形码的常量和变量可以存储一个<code>.UPCA</code>或者一个<code>.QRCode</code>(连同它的实例值),但是在任何指定时间只能存储其中之一。</p>
|
<p>这时,原始的<code>Barcode.UPCA</code>和其整数值被新的<code>Barcode.QRCode</code>和其字符串值所替代。条形码的常量和变量可以存储一个<code>.UPCA</code>或者一个<code>.QRCode</code>(连同它的相关值),但是在任何指定时间只能存储其中之一。</p>
|
||||||
<p>像以前那样,不同的条形码类型可以使用一个 switch 语句来检查,然而这次实例值可以被提取作为 switch 语句的一部分。你可以在<code>switch</code>的 case 分支代码中提取每个实例值作为一个常量(用<code>let</code>前缀)或者作为一个变量(用<code>var</code>前缀)来使用:</p>
|
<p>像以前那样,不同的条形码类型可以使用一个 switch 语句来检查,然而这次相关值可以被提取作为 switch 语句的一部分。你可以在<code>switch</code>的 case 分支代码中提取每个相关值作为一个常量(用<code>let</code>前缀)或者作为一个变量(用<code>var</code>前缀)来使用:</p>
|
||||||
<pre><code class="lang-swift">switch productBarcode {
|
<pre><code class="lang-swift">switch productBarcode {
|
||||||
case .UPCA(let numberSystem, let identifier, let check):
|
case .UPCA(let numberSystem, let identifier, let check):
|
||||||
println("UPC-A with value of \(numberSystem), \(identifier), \(check).")
|
println("UPC-A with value of \(numberSystem), \(identifier), \(check).")
|
||||||
@ -702,7 +702,7 @@ case .QRCode(let productCode):
|
|||||||
}
|
}
|
||||||
// 输出 "QR code with value of ABCDEFGHIJKLMNOP.”
|
// 输出 "QR code with value of ABCDEFGHIJKLMNOP.”
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>如果一个枚举成员的所有实例值被提取为常量,或者它们全部被提取为变量,为了简洁,你可以只放置一个<code>var</code>或者<code>let</code>标注在成员名称前:</p>
|
<p>如果一个枚举成员的所有相关值被提取为常量,或者它们全部被提取为变量,为了简洁,你可以只放置一个<code>var</code>或者<code>let</code>标注在成员名称前:</p>
|
||||||
<pre><code class="lang-swift">switch productBarcode {
|
<pre><code class="lang-swift">switch productBarcode {
|
||||||
case let .UPCA(numberSystem, identifier, check):
|
case let .UPCA(numberSystem, identifier, check):
|
||||||
println("UPC-A with value of \(numberSystem), \(identifier), \(check).")
|
println("UPC-A with value of \(numberSystem), \(identifier), \(check).")
|
||||||
@ -713,7 +713,7 @@ case let .QRCode(productCode):
|
|||||||
</code></pre>
|
</code></pre>
|
||||||
<p><a name="raw_values"></a></p>
|
<p><a name="raw_values"></a></p>
|
||||||
<h2 id="-raw-values-">原始值(Raw Values)</h2>
|
<h2 id="-raw-values-">原始值(Raw Values)</h2>
|
||||||
<p>在实例值小节的条形码例子中演示了一个枚举的成员如何声明它们存储不同类型的实例值。作为实例值的替代,枚举成员可以被默认值(称为原始值)预先填充,其中这些原始值具有相同的类型。</p>
|
<p>在<a href="#raw_values">Associated Values</a>小节的条形码例子中演示了一个枚举的成员如何声明它们存储不同类型的相关值。作为相关值的替代,枚举成员可以被默认值(称为原始值)预先填充,其中这些原始值具有相同的类型。</p>
|
||||||
<p>这里是一个枚举成员存储原始 ASCII 值的例子:</p>
|
<p>这里是一个枚举成员存储原始 ASCII 值的例子:</p>
|
||||||
<pre><code class="lang-swift">enum ASCIIControlCharacter: Character {
|
<pre><code class="lang-swift">enum ASCIIControlCharacter: Character {
|
||||||
case Tab = "\t"
|
case Tab = "\t"
|
||||||
@ -722,7 +722,7 @@ case let .QRCode(productCode):
|
|||||||
}
|
}
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>在这里,称为<code>ASCIIControlCharacter</code>的枚举的原始值类型被定义为字符型<code>Character</code>,并被设置了一些比较常见的 ASCII 控制字符。字符值的描述请详见字符串和字符<a href="03_Strings_and_Characters.html"><code>Strings and Characters</code></a>部分。</p>
|
<p>在这里,称为<code>ASCIIControlCharacter</code>的枚举的原始值类型被定义为字符型<code>Character</code>,并被设置了一些比较常见的 ASCII 控制字符。字符值的描述请详见字符串和字符<a href="03_Strings_and_Characters.html"><code>Strings and Characters</code></a>部分。</p>
|
||||||
<p>注意,原始值和实例值是不相同的。当你开始在你的代码中定义枚举的时候原始值是被预先填充的值,像上述三个 ASCII 码。对于一个特定的枚举成员,它的原始值始终是相同的。实例值是当你在创建一个基于枚举成员的新常量或变量时才会被设置,并且每次当你这么做得时候,它的值可以是不同的。</p>
|
<p>注意,原始值和相关值是不相同的。当你开始在你的代码中定义枚举的时候原始值是被预先填充的值,像上述三个 ASCII 码。对于一个特定的枚举成员,它的原始值始终是相同的。相关值是当你在创建一个基于枚举成员的新常量或变量时才会被设置,并且每次当你这么做得时候,它的值可以是不同的。</p>
|
||||||
<p>原始值可以是字符串,字符,或者任何整型值或浮点型值。每个原始值在它的枚举声明中必须是唯一的。当整型值被用于原始值,如果其他枚举成员没有值时,它们会自动递增。</p>
|
<p>原始值可以是字符串,字符,或者任何整型值或浮点型值。每个原始值在它的枚举声明中必须是唯一的。当整型值被用于原始值,如果其他枚举成员没有值时,它们会自动递增。</p>
|
||||||
<p>下面的枚举是对之前<code>Planet</code>这个枚举的一个细化,利用原始整型值来表示每个 planet 在太阳系中的顺序:</p>
|
<p>下面的枚举是对之前<code>Planet</code>这个枚举的一个细化,利用原始整型值来表示每个 planet 在太阳系中的顺序:</p>
|
||||||
<pre><code class="lang-swift">enum Planet: Int {
|
<pre><code class="lang-swift">enum Planet: Int {
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="2.9" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="2.9" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
@ -654,14 +654,14 @@ class VideoMode {
|
|||||||
}
|
}
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>在上面的示例中我们定义了一个名为<code>Resolution</code>的结构体,用来描述一个显示器的像素分辨率。这个结构体包含了两个名为<code>width</code>和<code>height</code>的储存属性。储存属性是捆绑和储存在类或结构体中的常量或变量。当这两个属性被初始化为整数<code>0</code>的时候,它们会被推断为<code>Int</code>类型。</p>
|
<p>在上面的示例中我们定义了一个名为<code>Resolution</code>的结构体,用来描述一个显示器的像素分辨率。这个结构体包含了两个名为<code>width</code>和<code>height</code>的储存属性。储存属性是捆绑和储存在类或结构体中的常量或变量。当这两个属性被初始化为整数<code>0</code>的时候,它们会被推断为<code>Int</code>类型。</p>
|
||||||
<p>在上面的示例中我们还定义了一个名为<code>VideoMode</code>的类,用来描述一个视频显示器的特定模式。这个类包含了四个储存属性变量。第一个是<code>分辨率</code>,它被初始化为一个新的<code>Resolution</code>结构体的实例,具有<code>Resolution</code>的属性类型。新<code>VideoMode</code>实例同时还会初始化其它三个属性,它们分别是,初始值为<code>false</code>(意为“non-interlaced video”)的<code>inteflaced</code>,回放帧率初始值为<code>0.0</code>的<code>frameRate</code>和值为可选<code>String</code>的<code>name</code>。<code>name</code>属性会被自动赋予一个默认值<code>nil</code>,意为“没有<code>name</code>值”,因它是一个可选类型。</p>
|
<p>在上面的示例中我们还定义了一个名为<code>VideoMode</code>的类,用来描述一个视频显示器的特定模式。这个类包含了四个储存属性变量。第一个是<code>分辨率</code>,它被初始化为一个新的<code>Resolution</code>结构体的实例,具有<code>Resolution</code>的属性类型。新<code>VideoMode</code>实例同时还会初始化其它三个属性,它们分别是,初始值为<code>false</code>(意为“non-interlaced video”)的<code>interlaced</code>,回放帧率初始值为<code>0.0</code>的<code>frameRate</code>和值为可选<code>String</code>的<code>name</code>。<code>name</code>属性会被自动赋予一个默认值<code>nil</code>,意为“没有<code>name</code>值”,因它是一个可选类型。</p>
|
||||||
<h3 id="-">类和结构体实例</h3>
|
<h3 id="-">类和结构体实例</h3>
|
||||||
<p><code>Resolution</code>结构体和<code>VideoMode</code>类的定义仅描述了什么是<code>Resolution</code>和<code>VideoMode</code>。它们并没有描述一个特定的分辨率(resolution)或者视频模式(video mode)。为了描述一个特定的分辨率或者视频模式,我们需要生成一个它们的实例。</p>
|
<p><code>Resolution</code>结构体和<code>VideoMode</code>类的定义仅描述了什么是<code>Resolution</code>和<code>VideoMode</code>。它们并没有描述一个特定的分辨率(resolution)或者视频模式(video mode)。为了描述一个特定的分辨率或者视频模式,我们需要生成一个它们的实例。</p>
|
||||||
<p>生成结构体和类实例的语法非常相似:</p>
|
<p>生成结构体和类实例的语法非常相似:</p>
|
||||||
<pre><code class="lang-swift">let someResolution = Resolution()
|
<pre><code class="lang-swift">let someResolution = Resolution()
|
||||||
let someVideoMode = VideoMode()
|
let someVideoMode = VideoMode()
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>结构体和类都使用构造器语法来生成新的实例。构造器语法的最简单形式是在结构体或者类的类型名称后跟随一个空括弧,如<code>Resolution()</code>或<code>VideoMode()</code>。通过这种方式所创建的类或者结构体实例,其属均会被初始化为默认值。<a href="14_Initialization.html">构造过程</a>章节会对类和结构体的初始化进行更详细的讨论。</p>
|
<p>结构体和类都使用构造器语法来生成新的实例。构造器语法的最简单形式是在结构体或者类的类型名称后跟随一个空括弧,如<code>Resolution()</code>或<code>VideoMode()</code>。通过这种方式所创建的类或者结构体实例,其属性均会被初始化为默认值。<a href="14_Initialization.html">构造过程</a>章节会对类和结构体的初始化进行更详细的讨论。</p>
|
||||||
<h3 id="-">属性访问</h3>
|
<h3 id="-">属性访问</h3>
|
||||||
<p>通过使用<em>点语法</em>(<em>dot syntax</em>),你可以访问实例中所含有的属性。其语法规则是,实例名后面紧跟属性名,两者通过点号(.)连接:</p>
|
<p>通过使用<em>点语法</em>(<em>dot syntax</em>),你可以访问实例中所含有的属性。其语法规则是,实例名后面紧跟属性名,两者通过点号(.)连接:</p>
|
||||||
<pre><code class="lang-swift">println("The width of someResolution is \(someResolution.width)")
|
<pre><code class="lang-swift">println("The width of someResolution is \(someResolution.width)")
|
||||||
@ -678,7 +678,7 @@ println("The width of someVideoMode is now \(someVideoMode.resolution.width
|
|||||||
// 输出 "The width of someVideoMode is now 1280"
|
// 输出 "The width of someVideoMode is now 1280"
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p> 注意:<br>与 Objective-C 语言不同的是,Swift 允许直接设置结构体属性的子属性。上面的最后一个例子,就是直接设置了<code>someVideoMode</code>中<code>resolution</code>属性的<code>width</code>这个子属性,以上操作并不需要从新设置<code>resolution</code>属性。</p>
|
<p> 注意:<br>与 Objective-C 语言不同的是,Swift 允许直接设置结构体属性的子属性。上面的最后一个例子,就是直接设置了<code>someVideoMode</code>中<code>resolution</code>属性的<code>width</code>这个子属性,以上操作并不需要重新设置<code>resolution</code>属性。</p>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
<h3 id="-memberwise-initializers-for-structure-types-">结构体类型的成员逐一构造器(Memberwise Initializers for structure Types)</h3>
|
<h3 id="-memberwise-initializers-for-structure-types-">结构体类型的成员逐一构造器(Memberwise Initializers for structure Types)</h3>
|
||||||
<p>所有结构体都有一个自动生成的成员逐一构造器,用于初始化新结构体实例中成员的属性。新实例中各个属性的初始值可以通过属性的名称传递到成员逐一构造器之中:</p>
|
<p>所有结构体都有一个自动生成的成员逐一构造器,用于初始化新结构体实例中成员的属性。新实例中各个属性的初始值可以通过属性的名称传递到成员逐一构造器之中:</p>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="2.10" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="2.10" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="2.11" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="2.11" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="2.12" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="2.12" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="2.13" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="2.13" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="2.14" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="2.14" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="2.15" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="2.15" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="2.16" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="2.16" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="2.17" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="2.17" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="2.18" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="2.18" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
@ -592,21 +592,21 @@
|
|||||||
<blockquote>
|
<blockquote>
|
||||||
<p>翻译:<a href="https://github.com/xiehurricane" target="_blank">xiehurricane</a><br>校对:<a href="https://github.com/happyming" target="_blank">happyming</a></p>
|
<p>翻译:<a href="https://github.com/xiehurricane" target="_blank">xiehurricane</a><br>校对:<a href="https://github.com/happyming" target="_blank">happyming</a></p>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
<h1 id="-type-casting-">类型检查(Type Casting)</h1>
|
<h1 id="-type-casting-">类型转换(Type Casting)</h1>
|
||||||
<hr>
|
<hr>
|
||||||
<p>本页包含内容:</p>
|
<p>本页包含内容:</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#defining_a_class_hierarchy_for_type_casting">定义一个类层次作为例子</a></li>
|
<li><a href="#defining_a_class_hierarchy_for_type_casting">定义一个类层次作为例子</a></li>
|
||||||
<li><a href="#checking_type">检查类型</a></li>
|
<li><a href="#checking_type">检查类型</a></li>
|
||||||
<li><a href="#downcasting">向下转型(Downcasting)</a></li>
|
<li><a href="#downcasting">向下转型(Downcasting)</a></li>
|
||||||
<li><a href="#type_casting_for_any_and_anyobject"><code>Any</code>和<code>AnyObject</code>的类型检查</a></li>
|
<li><a href="#type_casting_for_any_and_anyobject"><code>Any</code>和<code>AnyObject</code>的类型转换</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
<p><em>类型检查</em>是一种检查类实例的方式,并且或者也是让实例作为它的父类或者子类的一种方式。</p>
|
<p><em>类型转换</em>是一种检查类实例的方式,并且或者也是让实例作为它的父类或者子类的一种方式。</p>
|
||||||
<p>类型检查在 Swift 中使用<code>is</code> 和 <code>as</code>操作符实现。这两个操作符提供了一种简单达意的方式去检查值的类型或者转换它的类型。</p>
|
<p>类型转换在 Swift 中使用<code>is</code> 和 <code>as</code>操作符实现。这两个操作符提供了一种简单达意的方式去检查值的类型或者转换它的类型。</p>
|
||||||
<p>你也可以用来检查一个类是否实现了某个协议,就像在 <a href="Protocols.html#//apple_ref/doc/uid/TP40014097-CH25-XID_363">Checking for Protocol Conformance</a>部分讲述的一样。</p>
|
<p>你也可以用来检查一个类是否实现了某个协议,就像在 <a href="Protocols.html#//apple_ref/doc/uid/TP40014097-CH25-XID_363">Checking for Protocol Conformance</a>部分讲述的一样。</p>
|
||||||
<p><a name="defining_a_class_hierarchy_for_type_casting"></a></p>
|
<p><a name="defining_a_class_hierarchy_for_type_casting"></a></p>
|
||||||
<h2 id="-">定义一个类层次作为例子</h2>
|
<h2 id="-">定义一个类层次作为例子</h2>
|
||||||
<p>你可以将它用在类和子类的层次结构上,检查特定类实例的类型并且转换这个类实例的类型成为这个层次结构中的其他类型。这下面的三个代码段定义了一个类层次和一个包含了几个这些类实例的数组,作为类型检查的例子。</p>
|
<p>你可以将它用在类和子类的层次结构上,检查特定类实例的类型并且转换这个类实例的类型成为这个层次结构中的其他类型。这下面的三个代码段定义了一个类层次和一个包含了几个这些类实例的数组,作为类型转换的例子。</p>
|
||||||
<p>第一个代码片段定义了一个新的基础类<code>MediaItem</code>。这个类为任何出现在数字媒体库的媒体项提供基础功能。特别的,它声明了一个 <code>String</code> 类型的 <code>name</code> 属性,和一个<code>init name</code>初始化器。(它假定所有的媒体项都有个名称。)</p>
|
<p>第一个代码片段定义了一个新的基础类<code>MediaItem</code>。这个类为任何出现在数字媒体库的媒体项提供基础功能。特别的,它声明了一个 <code>String</code> 类型的 <code>name</code> 属性,和一个<code>init name</code>初始化器。(它假定所有的媒体项都有个名称。)</p>
|
||||||
<pre><code class="lang-swift">class MediaItem {
|
<pre><code class="lang-swift">class MediaItem {
|
||||||
var name: String
|
var name: String
|
||||||
@ -668,12 +668,12 @@ println("Media library contains \(movieCount) movies and \(songCount) songs
|
|||||||
Song</code>检查item是否为<code>Song</code>类型的实例。在循环结束后,<code>movieCount</code> 和 <code>songCount</code>的值就是被找到属于各自的类型的实例数量。</p>
|
Song</code>检查item是否为<code>Song</code>类型的实例。在循环结束后,<code>movieCount</code> 和 <code>songCount</code>的值就是被找到属于各自的类型的实例数量。</p>
|
||||||
<p><a name="downcasting"></a></p>
|
<p><a name="downcasting"></a></p>
|
||||||
<h2 id="-downcasting-">向下转型(Downcasting)</h2>
|
<h2 id="-downcasting-">向下转型(Downcasting)</h2>
|
||||||
<p>某类型的一个常量或变量可能在幕后实际上属于一个子类。你可以相信,上面就是这种情况。你可以尝试向下转到它的子类型,用类型检查操作符(<code>as</code>)</p>
|
<p>某类型的一个常量或变量可能在幕后实际上属于一个子类。你可以相信,上面就是这种情况。你可以尝试向下转到它的子类型,用类型转换操作符(<code>as</code>)</p>
|
||||||
<p>因为向下转型可能会失败,类型转型操作符带有两种不同形式。可选形式( optional form) <code>as?</code> 返回一个你试图下转成的类型的可选值(optional value)。强制形式 <code>as</code> 把试图向下转型和强制解包(force-unwraps)结果作为一个混合动作。</p>
|
<p>因为向下转型可能会失败,类型转型操作符带有两种不同形式。可选形式( optional form) <code>as?</code> 返回一个你试图下转成的类型的可选值(optional value)。强制形式 <code>as</code> 把试图向下转型和强制解包(force-unwraps)结果作为一个混合动作。</p>
|
||||||
<p>当你不确定向下转型可以成功时,用类型检查的可选形式(<code>as?</code>)。可选形式的类型检查总是返回一个可选值(optional value),并且若下转是不可能的,可选值将是 <code>nil</code> 。这使你能够检查向下转型是否成功。</p>
|
<p>当你不确定向下转型可以成功时,用类型转换的可选形式(<code>as?</code>)。可选形式的类型转换总是返回一个可选值(optional value),并且若下转是不可能的,可选值将是 <code>nil</code> 。这使你能够检查向下转型是否成功。</p>
|
||||||
<p>只有你可以确定向下转型一定会成功时,才使用强制形式。当你试图向下转型为一个不正确的类型时,强制形式的类型检查会触发一个运行时错误。</p>
|
<p>只有你可以确定向下转型一定会成功时,才使用强制形式。当你试图向下转型为一个不正确的类型时,强制形式的类型转换会触发一个运行时错误。</p>
|
||||||
<p>下面的例子,迭代了<code>library</code>里的每一个 <code>MediaItem</code> ,并打印出适当的描述。要这样做,<code>item</code>需要真正作为<code>Movie</code> 或 <code>Song</code>的类型来使用。不仅仅是作为 <code>MediaItem</code>。为了能够使用<code>Movie</code> 或 <code>Song</code>的 <code>director</code> 或 <code>artist</code>属性,这是必要的。</p>
|
<p>下面的例子,迭代了<code>library</code>里的每一个 <code>MediaItem</code> ,并打印出适当的描述。要这样做,<code>item</code>需要真正作为<code>Movie</code> 或 <code>Song</code>的类型来使用。不仅仅是作为 <code>MediaItem</code>。为了能够使用<code>Movie</code> 或 <code>Song</code>的 <code>director</code> 或 <code>artist</code>属性,这是必要的。</p>
|
||||||
<p>在这个示例中,数组中的每一个<code>item</code>可能是 <code>Movie</code> 或 <code>Song</code>。 事前你不知道每个<code>item</code>的真实类型,所以这里使用可选形式的类型检查 (<code>as?</code>)去检查循环里的每次下转。</p>
|
<p>在这个示例中,数组中的每一个<code>item</code>可能是 <code>Movie</code> 或 <code>Song</code>。 事前你不知道每个<code>item</code>的真实类型,所以这里使用可选形式的类型转换 (<code>as?</code>)去检查循环里的每次下转。</p>
|
||||||
<pre><code class="lang-swift">for item in library {
|
<pre><code class="lang-swift">for item in library {
|
||||||
if let movie = item as? Movie {
|
if let movie = item as? Movie {
|
||||||
println("Movie: '\(movie.name)', dir. \(movie.director)")
|
println("Movie: '\(movie.name)', dir. \(movie.director)")
|
||||||
@ -699,7 +699,7 @@ Song</code>检查item是否为<code>Song</code>类型的实例。在循环结束
|
|||||||
<p>注意:<br>转换没有真的改变实例或它的值。潜在的根本的实例保持不变;只是简单地把它作为它被转换成的类来使用。</p>
|
<p>注意:<br>转换没有真的改变实例或它的值。潜在的根本的实例保持不变;只是简单地把它作为它被转换成的类来使用。</p>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
<p><a name="type_casting_for_any_and_anyobject"></a></p>
|
<p><a name="type_casting_for_any_and_anyobject"></a></p>
|
||||||
<h2 id="-any-anyobject-"><code>Any</code>和<code>AnyObject</code>的类型检查</h2>
|
<h2 id="-any-anyobject-"><code>Any</code>和<code>AnyObject</code>的类型转换</h2>
|
||||||
<p>Swift为不确定类型提供了两种特殊类型别名:</p>
|
<p>Swift为不确定类型提供了两种特殊类型别名:</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li><code>AnyObject</code>可以代表任何class类型的实例。</li>
|
<li><code>AnyObject</code>可以代表任何class类型的实例。</li>
|
||||||
@ -709,9 +709,8 @@ Song</code>检查item是否为<code>Song</code>类型的实例。在循环结束
|
|||||||
<p>注意:<br>只有当你明确的需要它的行为和功能时才使用<code>Any</code>和<code>AnyObject</code>。在你的代码里使用你期望的明确的类型总是更好的。</p>
|
<p>注意:<br>只有当你明确的需要它的行为和功能时才使用<code>Any</code>和<code>AnyObject</code>。在你的代码里使用你期望的明确的类型总是更好的。</p>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
<h3 id="-anyobject-"><code>AnyObject</code>类型</h3>
|
<h3 id="-anyobject-"><code>AnyObject</code>类型</h3>
|
||||||
<p>当需要在工作中使用 Cocoa
|
<p>当需要在工作中使用 Cocoa APIs,它一般接收一个<code>AnyObject[]</code>类型的数组,或者说“一个任何对象类型的数组”。这是因为 Objective-C 没有明确的类型化数组。但是,你常常可以确定包含在仅从你知道的 API 信息提供的这样一个数组中的对象的类型。</p>
|
||||||
APIs,它一般接收一个<code>AnyObject[]</code>类型的数组,或者说“一个任何对象类型的数组”。这是因为 Objective-C 没有明确的类型化数组。但是,你常常可以确定包含在仅从你知道的 API 信息提供的这样一个数组中的对象的类型。</p>
|
<p>在这些情况下,你可以使用强制形式的类型转换(<code>as</code>)来下转在数组中的每一项到比 <code>AnyObject</code> 更明确的类型,不需要可选解析(optional unwrapping)。</p>
|
||||||
<p>在这些情况下,你可以使用强制形式的类型检查(<code>as</code>)来下转在数组中的每一项到比 <code>AnyObject</code> 更明确的类型,不需要可选解析(optional unwrapping)。</p>
|
|
||||||
<p>下面的示例定义了一个 <code>AnyObject[]</code> 类型的数组并填入三个<code>Movie</code>类型的实例:</p>
|
<p>下面的示例定义了一个 <code>AnyObject[]</code> 类型的数组并填入三个<code>Movie</code>类型的实例:</p>
|
||||||
<pre><code class="lang-swift">let someObjects: AnyObject[] = [
|
<pre><code class="lang-swift">let someObjects: AnyObject[] = [
|
||||||
Movie(name: "2001: A Space Odyssey", director: "Stanley Kubrick"),
|
Movie(name: "2001: A Space Odyssey", director: "Stanley Kubrick"),
|
||||||
@ -782,7 +781,7 @@ things.append(Movie(name: "Ghostbusters", director: "Ivan Reitman
|
|||||||
// a movie called 'Ghostbusters', dir. Ivan Reitman
|
// a movie called 'Ghostbusters', dir. Ivan Reitman
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p>注意:<br>在一个switch语句的case中使用强制形式的类型检查操作符(as, 而不是 as?)来检查和转换到一个明确的类型。在 switch case 语句的内容中这种检查总是安全的。</p>
|
<p>注意:<br>在一个switch语句的case中使用强制形式的类型转换操作符(as, 而不是 as?)来检查和转换到一个明确的类型。在 switch case 语句的内容中这种检查总是安全的。</p>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="2.19" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="2.19" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="2.20" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="2.20" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="2.21" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="2.21" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="2.22" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="2.22" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
@ -616,7 +616,7 @@
|
|||||||
b = temporaryA
|
b = temporaryA
|
||||||
}
|
}
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>这个函数使用写入读出(in-out)参数来交换<code>a</code>和<code>b</code>的值,请参考[写入读出参数][1]。</p>
|
<p>这个函数使用写入读出(in-out)参数来交换<code>a</code>和<code>b</code>的值,请参考<a href="../chapter2/06_Functions.html">写入读出参数</a>。</p>
|
||||||
<p><code>swapTwoInts</code>函数可以交换<code>b</code>的原始值到<code>a</code>,也可以交换a的原始值到<code>b</code>,你可以调用这个函数交换两个<code>Int</code>变量值:</p>
|
<p><code>swapTwoInts</code>函数可以交换<code>b</code>的原始值到<code>a</code>,也可以交换a的原始值到<code>b</code>,你可以调用这个函数交换两个<code>Int</code>变量值:</p>
|
||||||
<pre><code class="lang-swift">var someInt = 3
|
<pre><code class="lang-swift">var someInt = 3
|
||||||
var anotherInt = 107
|
var anotherInt = 107
|
||||||
@ -656,7 +656,7 @@ func swapTwoDoubles(inout a: Double, inout b: Double) {
|
|||||||
func swapTwoValues<T>(inout a: T, inout b: T)
|
func swapTwoValues<T>(inout a: T, inout b: T)
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>这个函数的泛型版本使用了占位类型名字(通常此情况下用字母<code>T</code>来表示)来代替实际类型名(如<code>In</code>、<code>String</code>或<code>Doubl</code>)。占位类型名没有提示<code>T</code>必须是什么类型,但是它提示了<code>a</code>和<code>b</code>必须是同一类型<code>T</code>,而不管<code>T</code>表示什么类型。只有<code>swapTwoValues</code>函数在每次调用时所传入的实际类型才能决定<code>T</code>所代表的类型。</p>
|
<p>这个函数的泛型版本使用了占位类型名字(通常此情况下用字母<code>T</code>来表示)来代替实际类型名(如<code>In</code>、<code>String</code>或<code>Doubl</code>)。占位类型名没有提示<code>T</code>必须是什么类型,但是它提示了<code>a</code>和<code>b</code>必须是同一类型<code>T</code>,而不管<code>T</code>表示什么类型。只有<code>swapTwoValues</code>函数在每次调用时所传入的实际类型才能决定<code>T</code>所代表的类型。</p>
|
||||||
<p>另外一个不同之处在于这个泛型函数名后面跟着的展位类型名字(T)是用尖括号括起来的(<T>)。这个尖括号告诉 Swift 那个<code>T</code>是<code>swapTwoValues</code>函数所定义的一个类型。因为<code>T</code>是一个占位命名类型,Swift 不会去查找命名为T的实际类型。</p>
|
<p>另外一个不同之处在于这个泛型函数名后面跟着的展位类型名字(T)是用尖括号括起来的(<code><T></code>)。这个尖括号告诉 Swift 那个<code>T</code>是<code>swapTwoValues</code>函数所定义的一个类型。因为<code>T</code>是一个占位命名类型,Swift 不会去查找命名为T的实际类型。</p>
|
||||||
<p><code>swapTwoValues</code>函数除了要求传入的两个任何类型值是同一类型外,也可以作为<code>swapTwoInts</code>函数被调用。每次<code>swapTwoValues</code>被调用,T所代表的类型值都会传给函数。</p>
|
<p><code>swapTwoValues</code>函数除了要求传入的两个任何类型值是同一类型外,也可以作为<code>swapTwoInts</code>函数被调用。每次<code>swapTwoValues</code>被调用,T所代表的类型值都会传给函数。</p>
|
||||||
<p>在下面的两个例子中,<code>T</code>分别代表<code>Int</code>和<code>String</code>:</p>
|
<p>在下面的两个例子中,<code>T</code>分别代表<code>Int</code>和<code>String</code>:</p>
|
||||||
<pre><code class="lang-swift">var someInt = 3
|
<pre><code class="lang-swift">var someInt = 3
|
||||||
@ -674,7 +674,7 @@ swapTwoValues(&someString, &anotherString)
|
|||||||
</blockquote>
|
</blockquote>
|
||||||
<p><a name="type_parameters"></a></p>
|
<p><a name="type_parameters"></a></p>
|
||||||
<h2 id="-">类型参数</h2>
|
<h2 id="-">类型参数</h2>
|
||||||
<p>在上面的<code>swapTwoValues</code>例子中,占位类型<code>T</code>是一种类型参数的示例。类型参数指定并命名为一个占位类型,并且紧随在函数名后面,使用一对尖括号括起来(如<T>)。</p>
|
<p>在上面的<code>swapTwoValues</code>例子中,占位类型<code>T</code>是一种类型参数的示例。类型参数指定并命名为一个占位类型,并且紧随在函数名后面,使用一对尖括号括起来(如<code><T></code>)。</p>
|
||||||
<p>一旦一个类型参数被指定,那么其可以被使用来定义一个函数的参数类型(如<code>swapTwoValues</code>函数中的参数<code>a</code>和<code>b</code>),或作为一个函数返回类型,或用作函数主体中的注释类型。在这种情况下,被类型参数所代表的占位类型不管函数任何时候被调用,都会被实际类型所替换(在上面<code>swapTwoValues</code>例子中,当函数第一次被调用时,<code>T</code>被<code>Int</code>替换,第二次调用时,被<code>String</code>替换。)。</p>
|
<p>一旦一个类型参数被指定,那么其可以被使用来定义一个函数的参数类型(如<code>swapTwoValues</code>函数中的参数<code>a</code>和<code>b</code>),或作为一个函数返回类型,或用作函数主体中的注释类型。在这种情况下,被类型参数所代表的占位类型不管函数任何时候被调用,都会被实际类型所替换(在上面<code>swapTwoValues</code>例子中,当函数第一次被调用时,<code>T</code>被<code>Int</code>替换,第二次调用时,被<code>String</code>替换。)。</p>
|
||||||
<p>你可支持多个类型参数,命名在尖括号中,用逗号分开。</p>
|
<p>你可支持多个类型参数,命名在尖括号中,用逗号分开。</p>
|
||||||
<p><a name="naming_type_parameters"></a></p>
|
<p><a name="naming_type_parameters"></a></p>
|
||||||
@ -691,8 +691,8 @@ swapTwoValues(&someString, &anotherString)
|
|||||||
<blockquote>
|
<blockquote>
|
||||||
<p>注意<br>栈的概念已被<code>UINavigationController</code>类使用来模拟试图控制器的导航结构。你通过调用<code>UINavigationController</code>的<code>pushViewController:animated:</code>方法来为导航栈添加(add)新的试图控制器;而通过<code>popViewControllerAnimated:</code>的方法来从导航栈中移除(pop)某个试图控制器。每当你需要一个严格的<code>后进先出</code>方式来管理集合,堆栈都是最实用的模型。</p>
|
<p>注意<br>栈的概念已被<code>UINavigationController</code>类使用来模拟试图控制器的导航结构。你通过调用<code>UINavigationController</code>的<code>pushViewController:animated:</code>方法来为导航栈添加(add)新的试图控制器;而通过<code>popViewControllerAnimated:</code>的方法来从导航栈中移除(pop)某个试图控制器。每当你需要一个严格的<code>后进先出</code>方式来管理集合,堆栈都是最实用的模型。</p>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
<p>下图展示了一个栈的压栈(push)/出栈(pop)的行为:</p>
|
<p>下图展示了一个栈的压栈(push)/出栈(pop)的行为: </p>
|
||||||
<p>![此处输入图片的描述][2]</p>
|
<p><img src="https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Art/stackPushPop_2x.png" alt="此处输入图片的描述"></p>
|
||||||
<ol>
|
<ol>
|
||||||
<li>现在有三个值在栈中;</li>
|
<li>现在有三个值在栈中;</li>
|
||||||
<li>第四个值“pushed”到栈的顶部;</li>
|
<li>第四个值“pushed”到栈的顶部;</li>
|
||||||
@ -740,18 +740,17 @@ stackOfStrings.push("cuatro")
|
|||||||
// 现在栈已经有4个string了
|
// 现在栈已经有4个string了
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>下图将展示<code>stackOfStrings</code>如何<code>push</code>这四个值进栈的过程:</p>
|
<p>下图将展示<code>stackOfStrings</code>如何<code>push</code>这四个值进栈的过程:</p>
|
||||||
<p>![此处输入图片的描述][3]</p>
|
<p><img src="https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Art/stackPushedFourStrings_2x.png" alt="此处输入图片的描述"></p>
|
||||||
<p>从栈中<code>pop</code>并移除值"cuatro":</p>
|
<p>从栈中<code>pop</code>并移除值"cuatro":</p>
|
||||||
<pre><code class="lang-swift">let fromTheTop = stackOfStrings.pop()
|
<pre><code class="lang-swift">let fromTheTop = stackOfStrings.pop()
|
||||||
// fromTheTop is equal to "cuatro", and the stack now contains 3 strings
|
// fromTheTop is equal to "cuatro", and the stack now contains 3 strings
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>下图展示了如何从栈中pop一个值的过程:
|
<p>下图展示了如何从栈中pop一个值的过程:<br><img src="https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Art/stackPoppedOneString_2x.png" alt="此处输入图片的描述"></p>
|
||||||
![此处输入图片的描述][4]</p>
|
|
||||||
<p>由于<code>Stack</code>是泛型类型,所以在 Swift 中其可以用来创建任何有效类型的栈,这种方式如同<code>Array</code>和<code>Dictionary</code>。</p>
|
<p>由于<code>Stack</code>是泛型类型,所以在 Swift 中其可以用来创建任何有效类型的栈,这种方式如同<code>Array</code>和<code>Dictionary</code>。</p>
|
||||||
<p><a name="type_constraints"></a></p>
|
<p><a name="type_constraints"></a></p>
|
||||||
<h2 id="-">类型约束</h2>
|
<h2 id="-">类型约束</h2>
|
||||||
<p><code>swapTwoValues</code>函数和<code>Stack</code>类型可以作用于任何类型,不过,有的时候对使用在泛型函数和泛型类型上的类型强制约束为某种特定类型是非常有用的。类型约束指定了一个必须继承自指定类的类型参数,或者遵循一个特定的协议或协议构成。</p>
|
<p><code>swapTwoValues</code>函数和<code>Stack</code>类型可以作用于任何类型,不过,有的时候对使用在泛型函数和泛型类型上的类型强制约束为某种特定类型是非常有用的。类型约束指定了一个必须继承自指定类的类型参数,或者遵循一个特定的协议或协议构成。</p>
|
||||||
<p>例如,Swift 的<code>Dictionary</code>类型对作用于其键的类型做了些限制。在[字典][5]的描述中,字典的键类型必须是<em>可哈希</em>,也就是说,必须有一种方法可以使其是唯一的表示。<code>Dictionary</code>之所以需要其键是可哈希是为了以便于其检查其是否包含某个特定键的值。如无此需求,<code>Dictionary</code>即不会告诉是否插入或者替换了某个特定键的值,也不能查找到已经存储在字典里面的给定键值。</p>
|
<p>例如,Swift 的<code>Dictionary</code>类型对作用于其键的类型做了些限制。在<a href="../chapter2/04_Collection_Types.html">字典</a>的描述中,字典的键类型必须是<em>可哈希</em>,也就是说,必须有一种方法可以使其被唯一的表示。<code>Dictionary</code>之所以需要其键是可哈希是为了以便于其检查其是否已经包含某个特定键的值。如无此需求,<code>Dictionary</code>既不会告诉是否插入或者替换了某个特定键的值,也不能查找到已经存储在字典里面的给定键值。</p>
|
||||||
<p>这个需求强制加上一个类型约束作用于<code>Dictionary</code>的键上,当然其键类型必须遵循<code>Hashable</code>协议(Swift 标准库中定义的一个特定协议)。所有的 Swift 基本类型(如<code>String</code>,<code>Int</code>, <code>Double</code>和 <code>Bool</code>)默认都是可哈希。</p>
|
<p>这个需求强制加上一个类型约束作用于<code>Dictionary</code>的键上,当然其键类型必须遵循<code>Hashable</code>协议(Swift 标准库中定义的一个特定协议)。所有的 Swift 基本类型(如<code>String</code>,<code>Int</code>, <code>Double</code>和 <code>Bool</code>)默认都是可哈希。</p>
|
||||||
<p>当你创建自定义泛型类型时,你可以定义你自己的类型约束,当然,这些约束要支持泛型编程的强力特征中的多数。抽象概念如<code>可哈希</code>具有的类型特征是根据它们概念特征来界定的,而不是它们的直接类型特征。</p>
|
<p>当你创建自定义泛型类型时,你可以定义你自己的类型约束,当然,这些约束要支持泛型编程的强力特征中的多数。抽象概念如<code>可哈希</code>具有的类型特征是根据它们概念特征来界定的,而不是它们的直接类型特征。</p>
|
||||||
<h3 id="-">类型约束语法</h3>
|
<h3 id="-">类型约束语法</h3>
|
||||||
@ -830,7 +829,7 @@ let stringIndex = findIndex(["Mike", "Malcolm", "Andrea
|
|||||||
<p>这个协议没有指定容器里item是如何存储的或何种类型是允许的。这个协议只指定三个任何遵循<code>Container</code>类型所必须支持的功能点。一个遵循的类型也可以提供其他额外的功能,只要满足这三个条件。</p>
|
<p>这个协议没有指定容器里item是如何存储的或何种类型是允许的。这个协议只指定三个任何遵循<code>Container</code>类型所必须支持的功能点。一个遵循的类型也可以提供其他额外的功能,只要满足这三个条件。</p>
|
||||||
<p>任何遵循<code>Container</code>协议的类型必须指定存储在其里面的值类型,必须保证只有正确类型的items可以加进容器里,必须明确可以通过其下标返回item类型。</p>
|
<p>任何遵循<code>Container</code>协议的类型必须指定存储在其里面的值类型,必须保证只有正确类型的items可以加进容器里,必须明确可以通过其下标返回item类型。</p>
|
||||||
<p>为了定义这三个条件,<code>Container</code>协议需要一个方法指定容器里的元素将会保留,而不需要知道特定容器的类型。<code>Container</code>协议需要指定任何通过<code>append</code>方法添加到容器里的值和容器里元素是相同类型,并且通过容器下标返回的容器元素类型的值的类型是相同类型。</p>
|
<p>为了定义这三个条件,<code>Container</code>协议需要一个方法指定容器里的元素将会保留,而不需要知道特定容器的类型。<code>Container</code>协议需要指定任何通过<code>append</code>方法添加到容器里的值和容器里元素是相同类型,并且通过容器下标返回的容器元素类型的值的类型是相同类型。</p>
|
||||||
<p>为了达到此目的,<code>Container</code>协议声明了一个ItemType的关联类型,写作<code>typealias ItemType</code>。The protocol does not define what ItemType is an alias for—that information is left for any conforming type to provide(这个协议不会定义<code>ItemType</code>是遵循类型所提供的何种信息的别名)。尽管如此,<code>ItemType</code>别名支持一种方法识别在一个容器里的items类型,以及定义一种使用在<code>append</code>方法和下标中的类型,以便保证任何期望的<code>Container</code>的行为是强制性的。</p>
|
<p>为了达到此目的,<code>Container</code>协议声明了一个ItemType的关联类型,写作<code>typealias ItemType</code>。这个协议不会定义<code>ItemType</code>是什么的别名,这个信息留给了任何遵循协议的类型来提供。尽管如此,<code>ItemType</code>别名支持一种方法识别在一个容器里的items类型,以及定义一种使用在<code>append</code>方法和下标中的类型,以便保证任何期望的<code>Container</code>的行为是强制性的。</p>
|
||||||
<p>这里是一个早前IntStack类型的非泛型版本,适用于遵循Container协议:</p>
|
<p>这里是一个早前IntStack类型的非泛型版本,适用于遵循Container协议:</p>
|
||||||
<pre><code class="lang-swift">struct IntStack: Container {
|
<pre><code class="lang-swift">struct IntStack: Container {
|
||||||
// original IntStack implementation
|
// original IntStack implementation
|
||||||
@ -881,14 +880,14 @@ let stringIndex = findIndex(["Mike", "Malcolm", "Andrea
|
|||||||
</code></pre>
|
</code></pre>
|
||||||
<p>这个时候,占位类型参数<code>T</code>被用作<code>append</code>方法的item参数和下标的返回类型。Swift 因此可以推断出被用作这个特定容器的<code>ItemType</code>的<code>T</code>的合适类型。</p>
|
<p>这个时候,占位类型参数<code>T</code>被用作<code>append</code>方法的item参数和下标的返回类型。Swift 因此可以推断出被用作这个特定容器的<code>ItemType</code>的<code>T</code>的合适类型。</p>
|
||||||
<h3 id="-">扩展一个存在的类型为一指定关联类型</h3>
|
<h3 id="-">扩展一个存在的类型为一指定关联类型</h3>
|
||||||
<p>在[使用扩展来添加协议兼容性][6]中有描述扩展一个存在的类型添加遵循一个协议。这个类型包含一个关联类型的协议。</p>
|
<p>在<a href="../chapter2/21_Protocols.html">使用扩展来添加协议兼容性</a>中有描述扩展一个存在的类型添加遵循一个协议。这个类型包含一个关联类型的协议。</p>
|
||||||
<p>Swift的<code>Array</code>已经提供<code>append</code>方法,一个<code>count</code>属性和通过下标来查找一个自己的元素。这三个功能都达到<code>Container</code>协议的要求。也就意味着你可以扩展<code>Array</code>去遵循<code>Container</code>协议,只要通过简单声明<code>Array</code>适用于该协议而已。如何实践这样一个空扩展,在[使用扩展来声明协议的采纳][7]中有描述这样一个实现一个空扩展的行为:</p>
|
<p>Swift的<code>Array</code>已经提供<code>append</code>方法,一个<code>count</code>属性和通过下标来查找一个自己的元素。这三个功能都达到<code>Container</code>协议的要求。也就意味着你可以扩展<code>Array</code>去遵循<code>Container</code>协议,只要通过简单声明<code>Array</code>适用于该协议而已。如何实践这样一个空扩展,在<a href="../chapter2/21_Protocols.html">使用扩展来声明协议的采纳</a>中有描述这样一个实现一个空扩展的行为:</p>
|
||||||
<pre><code class="lang-swift">extension Array: Container {}
|
<pre><code class="lang-swift">extension Array: Container {}
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>如同上面的泛型<code>Stack</code>类型一样,<code>Array的append</code>方法和下标保证<code>Swift</code>可以推断出<code>ItemType</code>所使用的适用的类型。定义了这个扩展后,你可以将任何<code>Array</code>当作<code>Container</code>来使用。</p>
|
<p>如同上面的泛型<code>Stack</code>类型一样,<code>Array的append</code>方法和下标保证<code>Swift</code>可以推断出<code>ItemType</code>所使用的适用的类型。定义了这个扩展后,你可以将任何<code>Array</code>当作<code>Container</code>来使用。</p>
|
||||||
<p><a name="where_clauses"></a></p>
|
<p><a name="where_clauses"></a></p>
|
||||||
<h2 id="where-">Where 语句</h2>
|
<h2 id="where-">Where 语句</h2>
|
||||||
<p>[类型约束][8]中描述的类型约束确保你定义关于类型参数的需求和一泛型函数或类型有关联。</p>
|
<p><a href="#type_constraints">类型约束</a>中描述的类型约束确保你定义关于类型参数的需求和一泛型函数或类型有关联。</p>
|
||||||
<p>对于关联类型的定义需求也是非常有用的。你可以通过这样去定义<em>where语句</em>作为一个类型参数队列的一部分。一个<code>where</code>语句使你能够要求一个关联类型遵循一个特定的协议,以及(或)那个特定的类型参数和关联类型可以是相同的。你可写一个<code>where</code>语句,通过紧随放置<code>where</code>关键字在类型参数队列后面,其后跟着一个或者多个针对关联类型的约束,以及(或)一个或多个类型和关联类型的等于关系。</p>
|
<p>对于关联类型的定义需求也是非常有用的。你可以通过这样去定义<em>where语句</em>作为一个类型参数队列的一部分。一个<code>where</code>语句使你能够要求一个关联类型遵循一个特定的协议,以及(或)那个特定的类型参数和关联类型可以是相同的。你可写一个<code>where</code>语句,通过紧随放置<code>where</code>关键字在类型参数队列后面,其后跟着一个或者多个针对关联类型的约束,以及(或)一个或多个类型和关联类型的等于关系。</p>
|
||||||
<p>下面的列子定义了一个名为<code>allItemsMatch</code>的泛型函数,用来检查是否两个<code>Container</code>单例包含具有相同顺序的相同元素。如果匹配到所有的元素,那么返回一个为<code>true</code>的<code>Boolean</code>值,反之,则相反。</p>
|
<p>下面的列子定义了一个名为<code>allItemsMatch</code>的泛型函数,用来检查是否两个<code>Container</code>单例包含具有相同顺序的相同元素。如果匹配到所有的元素,那么返回一个为<code>true</code>的<code>Boolean</code>值,反之,则相反。</p>
|
||||||
<p>这两个容器可以被检查出是否是相同类型的容器(虽然它们可以是),但它们确实拥有相同类型的元素。这个需求通过一个类型约束和<code>where</code>语句结合来表示:</p>
|
<p>这两个容器可以被检查出是否是相同类型的容器(虽然它们可以是),但它们确实拥有相同类型的元素。这个需求通过一个类型约束和<code>where</code>语句结合来表示:</p>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="2.23" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="2.23" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="2" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="2" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="3.1" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="3.1" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="3.2" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="3.2" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
@ -623,7 +623,8 @@
|
|||||||
<li><strong>用作声明的关键字:</strong> <em>class</em>、<em>deinit</em>、<em>enum</em>、<em>extension</em>、<em>func</em>、<em>import</em>、<em>init</em>、<em>let</em>、<em>protocol</em>、<em>static</em>、<em>struct</em>、<em>subscript</em>、<em>typealias</em>、<em>var</em></li>
|
<li><strong>用作声明的关键字:</strong> <em>class</em>、<em>deinit</em>、<em>enum</em>、<em>extension</em>、<em>func</em>、<em>import</em>、<em>init</em>、<em>let</em>、<em>protocol</em>、<em>static</em>、<em>struct</em>、<em>subscript</em>、<em>typealias</em>、<em>var</em></li>
|
||||||
<li><strong>用作语句的关键字:</strong> <em>break</em>、<em>case</em>、<em>continue</em>、<em>default</em>、<em>do</em>、<em>else</em>、<em>fallthrough</em>、<em>if</em>、<em>in</em>、<em>for</em>、<em>return</em>、<em>switch</em>、<em>where</em>、<em>while</em></li>
|
<li><strong>用作语句的关键字:</strong> <em>break</em>、<em>case</em>、<em>continue</em>、<em>default</em>、<em>do</em>、<em>else</em>、<em>fallthrough</em>、<em>if</em>、<em>in</em>、<em>for</em>、<em>return</em>、<em>switch</em>、<em>where</em>、<em>while</em></li>
|
||||||
<li><strong>用作表达和类型的关键字:</strong> <em>as</em>、<em>dynamicType</em>、<em>is</em>、<em>new</em>、<em>super</em>、<em>self</em>、<em>Self</em>、<em>Type</em>、<em>__COLUMN__</em>、<em>__FILE__</em>、<em>__FUNCTION__</em>、<em>__LINE__</em></li>
|
<li><strong>用作表达和类型的关键字:</strong> <em>as</em>、<em>dynamicType</em>、<em>is</em>、<em>new</em>、<em>super</em>、<em>self</em>、<em>Self</em>、<em>Type</em>、<em>__COLUMN__</em>、<em>__FILE__</em>、<em>__FUNCTION__</em>、<em>__LINE__</em></li>
|
||||||
<li><strong>特定上下文中被保留的关键字:</strong> <em>associativity</em>、<em>didSet</em>、<em>get</em>、<em>infix</em>、<em>inout</em>、<em>left</em>、<em>mutating</em>、<em>none</em>、<em>nonmutating</em>、<em>operator</em>、<em>override</em>、<em>postfix</em>、<em>precedence</em>、<em>prefix</em>、<em>right</em>、<em>set</em>、<em>unowned</em>、<em>unowned(safe)</em>、<em>unowned(unsafe)</em>、<em>weak</em>、<em>willSet</em>,这些关键字在特定上下文之外可以被用于标识符。</li>
|
<li><strong>特定上下文中被保留的关键字:</strong> <em>associativity</em>、<em>didSet</em>、<em>get</em>、<em>infix</em>、<em>inout</em>、<em>left</em>、<em>mutating</em>、<em>none</em>、<em>nonmutating</em>、<em>operator</em>、<em>override</em>、<em>postfix</em>、
|
||||||
|
<em>precedence</em>、<em>prefix</em>、<em>right</em>、<em>set</em>、<em>unowned</em>、<em>unowned(safe)</em>、<em>unowned(unsafe)</em>、<em>weak</em>、<em>willSet</em>,这些关键字在特定上下文之外可以被用于标识符。</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p><a name="literals"></a></p>
|
<p><a name="literals"></a></p>
|
||||||
<h2 id="-">字面量</h2>
|
<h2 id="-">字面量</h2>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="3.3" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="3.3" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="3.4" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="3.4" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="3.6" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="3.6" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="3.7" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="3.7" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="3.8" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="3.8" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="3.9" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="3.9" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -44,7 +44,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="3.10" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="3.10" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="3.5" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="3.5" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="3" data-basepath=".." data-revision="1402840691919">
|
<div class="book" data-level="3" data-basepath=".." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -44,7 +44,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="book" data-level="0" data-basepath="." data-revision="1402840691919">
|
<div class="book" data-level="0" data-basepath="." data-revision="1402845135014">
|
||||||
<div class="book-header">
|
<div class="book-header">
|
||||||
<!-- Actions Left -->
|
<!-- Actions Left -->
|
||||||
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
CACHE MANIFEST
|
CACHE MANIFEST
|
||||||
# Revision 1402840691921
|
# Revision 1402845135015
|
||||||
|
|
||||||
CACHE:
|
CACHE:
|
||||||
index.html
|
index.html
|
||||||
chapter1/01_swift.html
|
|
||||||
chapter1/02_a_swift_tour.html
|
chapter1/02_a_swift_tour.html
|
||||||
|
chapter1/01_swift.html
|
||||||
chapter1/chapter1.html
|
chapter1/chapter1.html
|
||||||
chapter2/13_Inheritance.html
|
chapter2/13_Inheritance.html
|
||||||
chapter2/01_The_Basics.html
|
chapter2/01_The_Basics.html
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user