make gitbook

This commit is contained in:
numbbbbb
2014-06-17 18:39:49 +08:00
parent cf9fb926d4
commit bd55b1b8ed
44 changed files with 851 additions and 831 deletions

View File

@ -34,7 +34,7 @@
<div class="book" data-github="https://github.com/numbbbbb/the-swift-programming-language-in-chinese" data-level="1.1" data-basepath=".." data-revision="1402976636475">
<div class="book" data-github="https://github.com/numbbbbb/the-swift-programming-language-in-chinese" data-level="1.1" data-basepath=".." data-revision="1403001528979">
<div class="book-header">
<!-- Actions Left -->
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
@ -595,7 +595,7 @@
<div class="page-inner">
<section class="normal" id="section-gitbook_588">
<section class="normal" id="section-gitbook_738">
<blockquote>
<p>翻译:<a href="https://github.com/numbbbbb" target="_blank">numbbbbb</a><br>校对:<a href="https://github.com/yeahdongcn" target="_blank">yeahdongcn</a></p>

View File

@ -34,7 +34,7 @@
<div class="book" data-github="https://github.com/numbbbbb/the-swift-programming-language-in-chinese" data-level="1.2" data-basepath=".." data-revision="1402976636475">
<div class="book" data-github="https://github.com/numbbbbb/the-swift-programming-language-in-chinese" data-level="1.2" data-basepath=".." data-revision="1403001528979">
<div class="book-header">
<!-- Actions Left -->
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
@ -595,10 +595,11 @@
<div class="page-inner">
<section class="normal" id="section-gitbook_590">
<section class="normal" id="section-gitbook_740">
<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>
校对:<a href="https://github.com/shinyzhu" target="_blank">shinyzhu</a>, <a href="https://github.com/stanzhai" target="_blank">stanzhai</a></p>
</blockquote>
<h1 id="swift-">Swift 初见</h1>
<hr>
@ -618,8 +619,9 @@
<p>如果你写过 C 或者 Objective-C 代码,那你应该很熟悉这种形式——在 Swift 中,这行代码就是一个完整的程序。你不需要为了输入输出或者字符串处理导入一个单独的库。全局作用域中的代码会被自动当做程序的入口点,所以你也不需要<code>main</code>函数。你同样不需要在每个语句结尾写上分号。</p>
<p>这个教程会通过一系列编程例子来让你对 Swift 有初步了解,如果你有什么不理解的地方也不用担心——任何本章介绍的内容都会在后面的章节中详细讲解。</p>
<blockquote>
<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>
<p>注意:
为了获得最好的体验,在 Xcode 当中使用代码预览功能。代码预览功能可以让你编辑代码并实时看到运行结果。
<a href="https://github.com/numbbbbb/the-swift-programming-language-in-chinese/raw/gh-pages/source/chapter1/GuidedTour.playground.zip">打开Playground</a></p>
</blockquote>
<p><a name="simple_values"></a></p>
<h2 id="-">简单值</h2>
@ -635,7 +637,8 @@ let implicitDouble = 70.0
let explicitDouble: Double = 70
</code></pre>
<blockquote>
<p>练习:<br>创建一个常量,显式指定类型为<code>Float</code>并指定初始值为4。</p>
<p>练习:
创建一个常量,显式指定类型为<code>Float</code>并指定初始值为4。</p>
</blockquote>
<p>值永远不会被隐式转换为其他类型。如果你需要把一个值转换成其他类型,请显式转换。</p>
<pre><code class="lang-swift">let label = &quot;The width is&quot;
@ -643,7 +646,8 @@ let width = 94
let widthLabel = label + String(width)
</code></pre>
<blockquote>
<p>练习:<br>删除最后一行中的<code>String</code>,错误提示是什么?</p>
<p>练习:
删除最后一行中的<code>String</code>,错误提示是什么?</p>
</blockquote>
<p>有一种更简单的把值转换成字符串的方法:把值写到括号中,并且在括号之前写一个反斜杠。例如:</p>
<pre><code class="lang-swift">let apples = 3
@ -652,7 +656,8 @@ let appleSummary = &quot;I have \(apples) apples.&quot;
let fruitSummary = &quot;I have \(apples + oranges) pieces of fruit.&quot;
</code></pre>
<blockquote>
<p>练习:<br>使用<code>\()</code>来把一个浮点计算转换成字符串,并加上某人的名字,和他打个招呼。</p>
<p>练习:
使用<code>\()</code>来把一个浮点计算转换成字符串,并加上某人的名字,和他打个招呼。</p>
</blockquote>
<p>使用方括号<code>[]</code>来创建数组和字典并使用下标或者键key来访问元素。</p>
<pre><code class="lang-swift">var shoppingList = [&quot;catfish&quot;, &quot;water&quot;, &quot;tulips&quot;, &quot;blue paint&quot;]
@ -697,7 +702,8 @@ if let name = optionalName {
}
</code></pre>
<blockquote>
<p>练习:<br><code>optionalName</code>改成<code>nil</code>greeting会是什么添加一个<code>else</code>语句,当<code>optionalName</code><code>nil</code>时给greeting赋一个不同的值。</p>
<p>练习:
<code>optionalName</code>改成<code>nil</code>greeting会是什么添加一个<code>else</code>语句,当<code>optionalName</code><code>nil</code>时给greeting赋一个不同的值。</p>
</blockquote>
<p>如果变量的可选值是<code>nil</code>,条件会判断为<code>false</code>,大括号中的代码会被跳过。如果不是<code>nil</code>,会将值赋给<code>let</code>后面的常量,这样代码块中就可以使用这个值了。</p>
<p><code>switch</code>支持任意类型的数据以及各种比较操作——不仅仅是整数以及测试相等。</p>
@ -714,7 +720,8 @@ default:
}
</code></pre>
<blockquote>
<p>练习:<br>删除<code>default</code>语句,看看会有什么错误?</p>
<p>练习:
删除<code>default</code>语句,看看会有什么错误?</p>
</blockquote>
<p>运行<code>switch</code>中匹配到的子句之后,程序会退出<code>switch</code>语句,并不会继续向下运行,所以不需要在每个子句结尾写<code>break</code></p>
<p>你可以使用<code>for-in</code>来遍历字典,需要两个变量来表示每个键值对。</p>
@ -734,7 +741,8 @@ for (kind, numbers) in interestingNumbers {
largest
</code></pre>
<blockquote>
<p>练习:<br>添加另一个变量来记录哪种类型的数字是最大的。</p>
<p>练习:
添加另一个变量来记录哪种类型的数字是最大的。</p>
</blockquote>
<p>使用<code>while</code>来重复运行一段代码直到不满足条件。循环条件可以在开头也可以在结尾。</p>
<pre><code class="lang-swift">var n = 2
@ -772,7 +780,8 @@ secondForLoop
greet(&quot;Bob&quot;, &quot;Tuesday&quot;)
</code></pre>
<blockquote>
<p>练习:<br>删除<code>day</code>参数,添加一个参数来表示今天吃了什么午饭。</p>
<p>练习:
删除<code>day</code>参数,添加一个参数来表示今天吃了什么午饭。</p>
</blockquote>
<p>使用一个元组来返回多个值。</p>
<pre><code class="lang-swift">func getGasPrices() -&gt; (Double, Double, Double) {
@ -792,7 +801,8 @@ sumOf()
sumOf(42, 597, 12)
</code></pre>
<blockquote>
<p>练习:<br>写一个计算参数平均值的函数。</p>
<p>练习:
写一个计算参数平均值的函数。</p>
</blockquote>
<p>函数可以嵌套。被嵌套的函数可以访问外侧函数的变量,你可以使用嵌套函数来重构一个太长或者太复杂的函数。</p>
<pre><code class="lang-swift">func returnFifteen() -&gt; Int {
@ -838,7 +848,8 @@ hasAnyMatches(numbers, lessThanTen)
})
</code></pre>
<blockquote>
<p>练习:<br>重写闭包对所有奇数返回0。</p>
<p>练习:
重写闭包对所有奇数返回0。</p>
</blockquote>
<p>有很多种创建闭包的方法。如果一个闭包的类型已知,比如作为一个回调函数,你可以忽略参数的类型和返回值。单个语句闭包会把它语句的值当做结果返回。</p>
<pre><code class="lang-swift">numbers.map({ number in 3 * number })
@ -857,7 +868,8 @@ hasAnyMatches(numbers, lessThanTen)
}
</code></pre>
<blockquote>
<p>练习:<br>使用<code>let</code>添加一个常量属性,再添加一个接收一个参数的方法。</p>
<p>练习:
使用<code>let</code>添加一个常量属性,再添加一个接收一个参数的方法。</p>
</blockquote>
<p>要创建一个类的实例,在类名后面加上括号。使用点语法来访问实例的属性和方法。</p>
<pre><code class="lang-swift">var shape = Shape()
@ -904,7 +916,8 @@ test.area()
test.simpleDescription()
</code></pre>
<blockquote>
<p>练习:<br>创建<code>NamedShape</code>的另一个子类<code>Circle</code>,构造器接收两个参数,一个是半径一个是名称,实现<code>area</code><code>describe</code>方法。</p>
<p>练习:
创建<code>NamedShape</code>的另一个子类<code>Circle</code>,构造器接收两个参数,一个是半径一个是名称,实现<code>area</code><code>describe</code>方法。</p>
</blockquote>
<p>属性可以有 getter 和 setter 。</p>
<pre><code class="lang-swift">class EquilateralTriangle: NamedShape {
@ -1005,7 +1018,8 @@ let ace = Rank.Ace
let aceRawValue = ace.toRaw()
</code></pre>
<blockquote>
<p>练习:<br>写一个函数,通过比较它们的原始值来比较两个<code>Rank</code>值。</p>
<p>练习:
写一个函数,通过比较它们的原始值来比较两个<code>Rank</code>值。</p>
</blockquote>
<p>在上面的例子中,枚举原始值的类型是<code>Int</code>,所以你只需要设置第一个原始值。剩下的原始值会按照顺序赋值。你也可以使用字符串或者浮点数作为枚举的原始值。</p>
<p>使用<code>toRaw</code><code>fromRaw</code>函数来在原始值和枚举值之间进行转换。</p>
@ -1034,7 +1048,8 @@ let hearts = Suit.Hearts
let heartsDescription = hearts.simpleDescription()
</code></pre>
<blockquote>
<p>练习:<br><code>Suit</code>添加一个<code>color</code>方法,对<code>spades</code><code>clubs</code>返回“black”<code>hearts</code><code>diamonds</code>返回“red”。</p>
<p>练习:
<code>Suit</code>添加一个<code>color</code>方法,对<code>spades</code><code>clubs</code>返回“black”<code>hearts</code><code>diamonds</code>返回“red”。</p>
</blockquote>
<p>注意,有两种方式可以引用<code>Hearts</code>成员:给<code>hearts</code>常量赋值时,枚举成员<code>Suit.Hearts</code>需要用全名来引用,因为常量没有显式指定类型。在<code>switch</code>里,枚举成员使用缩写<code>.Hearts</code>来引用,因为<code>self</code>的值已经知道是一个<code>suit</code>。已知变量类型的情况下你可以使用缩写。</p>
<p>使用<code>struct</code>来创建一个结构体。结构体和类有很多相同的地方,比如方法和构造器。它们之间最大的一个区别就是
@ -1051,7 +1066,8 @@ let threeOfSpades = Card(rank: .Three, suit: .Spades)
let threeOfSpadesDescription = threeOfSpades.simpleDescription()
</code></pre>
<blockquote>
<p>练习:<br><code>Card</code>添加一个方法,创建一副完整的扑克牌并把每张牌的 rank 和 suit 对应起来。</p>
<p>练习:
<code>Card</code>添加一个方法,创建一副完整的扑克牌并把每张牌的 rank 和 suit 对应起来。</p>
</blockquote>
<p>一个枚举成员的实例可以有实例值。相同枚举成员的实例可以有不同的值。创建实例的时候传入值即可。实例值和原始值是不同的:枚举成员的原始值对于所有实例都是相同的,而且你是在定义枚举的时候设置原始值。</p>
<p>例如,考虑从服务器获取日出和日落的时间。服务器会返回正常结果或者错误信息。</p>
@ -1071,7 +1087,8 @@ case let .Error(error):
}
</code></pre>
<blockquote>
<p>练习:<br><code>ServerResponse</code><code>switch</code>添加第三种情况。</p>
<p>练习:
<code>ServerResponse</code><code>switch</code>添加第三种情况。</p>
</blockquote>
<p>注意如何从<code>ServerResponse</code>中提取日升和日落时间。</p>
<p><a name="protocols_and_extensions"></a></p>
@ -1105,7 +1122,8 @@ b.adjust()
let bDescription = b.simpleDescription
</code></pre>
<blockquote>
<p>练习:<br>写一个实现这个协议的枚举。</p>
<p>练习:
写一个实现这个协议的枚举。</p>
</blockquote>
<p>注意声明<code>SimpleStructure</code>时候<code>mutating</code>关键字用来标记一个会修改结构体的方法。<code>SimpleClass</code>的声明不需要标记任何方法因为类中的方法经常会修改类。</p>
<p>使用<code>extension</code>来为现有的类型添加功能,比如新的方法和参数。你可以使用扩展来改造定义在别处,甚至是从外部库或者框架引入的一个类型,使得这个类型遵循某个协议。</p>
@ -1120,7 +1138,8 @@ let bDescription = b.simpleDescription
7.simpleDescription
</code></pre>
<blockquote>
<p>练习:<br><code>Double</code>类型写一个扩展,添加<code>absoluteValue</code>功能。</p>
<p>练习:
<code>Double</code>类型写一个扩展,添加<code>absoluteValue</code>功能。</p>
</blockquote>
<p>你可以像使用其他命名类型一样使用协议名——例如,创建一个有不同类型但是都实现一个协议的对象集合。当你处理类型是协议的值时,协议外定义的方法不可用。</p>
<pre><code class="lang-swift">let protocolValue: ExampleProtocol = a
@ -1163,7 +1182,8 @@ possibleInteger = .Some(100)
anyCommonElements([1, 2, 3], [3])
</code></pre>
<blockquote>
<p>练习:<br>修改<code>anyCommonElements</code>函数来创建一个函数,返回一个数组,内容是两个序列的共有元素。</p>
<p>练习:
修改<code>anyCommonElements</code>函数来创建一个函数,返回一个数组,内容是两个序列的共有元素。</p>
</blockquote>
<p>简单起见,你可以忽略<code>where</code>,只在冒号后面写协议或者类名。<code>&lt;T: Equatable&gt;</code><code>&lt;T where T: Equatable&gt;</code>是等价的。</p>

View File

@ -34,7 +34,7 @@
<div class="book" data-github="https://github.com/numbbbbb/the-swift-programming-language-in-chinese" data-level="1" data-basepath=".." data-revision="1402976636475">
<div class="book" data-github="https://github.com/numbbbbb/the-swift-programming-language-in-chinese" data-level="1" data-basepath=".." data-revision="1403001528979">
<div class="book-header">
<!-- Actions Left -->
<a href="#" class="btn pull-left toggle-summary" aria-label="Toggle summary"><i class="fa fa-align-justify"></i></a>
@ -595,7 +595,7 @@
<div class="page-inner">
<section class="normal" id="section-gitbook_592">
<section class="normal" id="section-gitbook_742">
<h1 id="-swift">欢迎使用 Swift</h1>
<p>在本章中您将了解 Swift 的特性和开发历史,并对 Swift 有一个初步的了解。</p>