add arc content

This commit is contained in:
numbbbbb
2014-06-05 22:13:54 +08:00
committed by Wang Hao
parent 41e9d7566e
commit c8e1bc09e8
40 changed files with 166 additions and 86 deletions

View File

@ -46,7 +46,7 @@
<div class="book" data-level="2.1" data-basepath=".." data-revision="1401968172845">
<div class="book" data-level="2.1" data-basepath=".." data-revision="1401977527536">
<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>
@ -576,7 +576,7 @@
<div class="page-inner">
<section class="normal" id="section-gitbook_15">
<section class="normal" id="section-gitbook_8">
<h1 id="-">基础部分</h1>
<p>Swift 是 iOS 和 OS X 应用开发的一门新语言。然而,如果你有 C 或者 Objective-C 开发经验的话,你会发现 Swift 的很多内容都是你熟悉的。</p>
@ -661,41 +661,7 @@ this is the end of the first multiline comment */
<p>与其他大部分编程语言不同Swift 并不强制要求你在每条语句的结尾处使用分号(;),当然,你也可以按照你自己的习惯添加分号。有一种情况下必须要用分号,即你打算在同一行内写多条独立的语句:</p>
<pre><code>let cat = &quot;🐱&quot;; println(cat)
// prints &quot;🐱&quot;
</code></pre><h2 id="-">整数</h2>
<p>整数就是没有小数部分的数字,比如<code>42</code><code>23</code>。整数分有符号(正、负、零)或者无符号(正、零)两种。</p>
<p>Swift 提供了8、16、32和64位的有符号和无符号整数。这些整数和 C 的命名习惯很像比如8位无符号整数类型是<code>UInt8</code>32位有符号整数类型是<code>Int32</code>。就像 Swift 的其他类型一样,这些整数类型的名字使用大写字母来命名。</p>
<h3 id="-">整数范围</h3>
<p>你可以访问每个整数类型的<code>min</code><code>max</code>属性来获取这个类型的最小值和最大值:</p>
<pre><code>let minValue = UInt8.min // UInt8 类型的 minValue 等于0
let maxValue = UInt8.max // UInt8 类型的 maxValue 等于255
</code></pre><p>这两个值的类型和右侧的整数类型是相同的(比如例子中的<code>UInt8</code>),因此你可以在表达式中把它们和同类型的值一同使用。</p>
<h3 id="int">Int</h3>
<p>大多数情况下你并不需要指定整数长度。Swift 提供了一个特别的整数类型<code>Int</code>,这个类型的长度和当前平台的原生字长一样:</p>
<ul>
<li>在32位平台上<code>Int</code><code>Int32</code>长度相同</li>
<li>在64位平台上<code>Int</code><code>Int64</code>长度相同</li>
</ul>
<p>一般来说,最好使用<code>Int</code>类型除非你需要指定整数长度。这可以保证代码的一致性和可复用性。即使在32位平台上<code>Int</code>也可以存储范围为<code>-2147483648</code>~<code>2147483647</code>的整数,大多数时候这已经够用了。</p>
<h3 id="uint">Uint</h3>
<p>Swift 还提供了一个无符号整数类型<code>UInt</code>,这个类型的长度和当前平台的原生字长一样:</p>
<ul>
<li>在32位平台上<code>UInt</code><code>UInt32</code>长度相同</li>
<li>在64位平台上<code>UInt</code><code>UInt64</code>长度相同</li>
</ul>
<blockquote>
<p>注意:只在你需要使用无符号整数类型并且长度和平台原生字长相同的时候才使用<code>Uint</code>。如果不是这种情况,最好使用<code>Int</code>,即使要存储的值已知是非负数。使用<code>Int</code>可以保证代码的可复用性,避免不同类型之间的转换,并且符合整数类型推测,详情请见<code>类型安全和类型推测(待添加链接)</code></p>
</blockquote>
<h2 id="-">浮点数</h2>
<p>浮点数是有小数部分的数字,比如<code>3.14159</code><code>0.1</code><code>-273.15</code></p>
<p>浮点类型可以表示的数字范围比整数类型要大,因此可以存储比<code>Int</code>类型更大或者更小的数字。Swift 提供了两种有符号浮点数类型:</p>
<ul>
<li><code>Double</code>表示64位浮点数。当浮点值非常大或者需要非常准确的时候使用此类型。</li>
<li><code>Float</code>表示32位浮点数。当浮点值不需要使用<code>Double</code>的时候使用此类型。</li>
</ul>
<blockquote>
<p>注意:<code>Double</code>的准确程度是至少15个十进制数字<code>Float</code>的准确程度是至少6个十进制数字。到底选择哪个浮点类型取决于你要存储的值。</p>
</blockquote>
</code></pre>
</section>

View File

@ -46,7 +46,7 @@
<div class="book" data-level="2.2" data-basepath=".." data-revision="1401968172845">
<div class="book" data-level="2.2" data-basepath=".." data-revision="1401977527536">
<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>

View File

@ -46,7 +46,7 @@
<div class="book" data-level="2.3" data-basepath=".." data-revision="1401968172845">
<div class="book" data-level="2.3" data-basepath=".." data-revision="1401977527536">
<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>
@ -576,7 +576,7 @@
<div class="page-inner">
<section class="normal" id="section-gitbook_16">
<section class="normal" id="section-gitbook_9">
<h1 id="-strings-and-characters-">字符串和字符 (Strings and Characters)</h1>
<p><strong>String</strong> 是一个有序的字符集合,例如 &quot;hello, world&quot;, &quot;albatross&quot;。Swift 字符串通过 <strong>String</strong> 类型来表示,也可以表示为 <strong>Character</strong> 类型值的集合。</p>

View File

@ -46,7 +46,7 @@
<div class="book" data-level="2.4" data-basepath=".." data-revision="1401968172845">
<div class="book" data-level="2.4" data-basepath=".." data-revision="1401977527536">
<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>

View File

@ -46,7 +46,7 @@
<div class="book" data-level="2.5" data-basepath=".." data-revision="1401968172845">
<div class="book" data-level="2.5" data-basepath=".." data-revision="1401977527536">
<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>

View File

@ -46,7 +46,7 @@
<div class="book" data-level="2.6" data-basepath=".." data-revision="1401968172845">
<div class="book" data-level="2.6" data-basepath=".." data-revision="1401977527536">
<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>
@ -576,7 +576,7 @@
<div class="page-inner">
<section class="normal" id="section-gitbook_19">
<section class="normal" id="section-gitbook_12">
<h1 id="-functions-">函数Functions</h1>
<p>函数是用来完成特定任务的独立的代码块。你给一个函数起一个合适的名字,用来标示函数做什么,并且当函数需要执行的时候,这个名字会被“调用”。</p>

View File

@ -46,7 +46,7 @@
<div class="book" data-level="2.7" data-basepath=".." data-revision="1401968172845">
<div class="book" data-level="2.7" data-basepath=".." data-revision="1401977527536">
<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>

View File

@ -46,7 +46,7 @@
<div class="book" data-level="2.8" data-basepath=".." data-revision="1401968172845">
<div class="book" data-level="2.8" data-basepath=".." data-revision="1401977527536">
<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>

View File

@ -46,7 +46,7 @@
<div class="book" data-level="2.9" data-basepath=".." data-revision="1401968172845">
<div class="book" data-level="2.9" data-basepath=".." data-revision="1401977527536">
<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>
@ -576,7 +576,7 @@
<div class="page-inner">
<section class="normal" id="section-gitbook_22">
<section class="normal" id="section-gitbook_15">
<h3 id="-">类和结构体</h3>

View File

@ -46,7 +46,7 @@
<div class="book" data-level="2.10" data-basepath=".." data-revision="1401968172845">
<div class="book" data-level="2.10" data-basepath=".." data-revision="1401977527536">
<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>

View File

@ -46,7 +46,7 @@
<div class="book" data-level="2.11" data-basepath=".." data-revision="1401968172845">
<div class="book" data-level="2.11" data-basepath=".." data-revision="1401977527536">
<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>

View File

@ -46,7 +46,7 @@
<div class="book" data-level="2.12" data-basepath=".." data-revision="1401968172845">
<div class="book" data-level="2.12" data-basepath=".." data-revision="1401977527536">
<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>

View File

@ -46,7 +46,7 @@
<div class="book" data-level="2.13" data-basepath=".." data-revision="1401968172845">
<div class="book" data-level="2.13" data-basepath=".." data-revision="1401977527536">
<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>

View File

@ -46,7 +46,7 @@
<div class="book" data-level="2.14" data-basepath=".." data-revision="1401968172845">
<div class="book" data-level="2.14" data-basepath=".." data-revision="1401977527536">
<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>

View File

@ -46,7 +46,7 @@
<div class="book" data-level="2.15" data-basepath=".." data-revision="1401968172845">
<div class="book" data-level="2.15" data-basepath=".." data-revision="1401977527536">
<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>

View File

@ -46,7 +46,7 @@
<div class="book" data-level="2.16" data-basepath=".." data-revision="1401968172845">
<div class="book" data-level="2.16" data-basepath=".." data-revision="1401977527536">
<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>
@ -576,6 +576,24 @@
<div class="page-inner">
<section class="normal" id="section-gitbook_22">
<h1 id="-">自动引用计数</h1>
<p>Swift使用自动引用计数这一机制(ARC)来跟踪和管理你的应用程序的内存。通常情况下Swift的内存管理机制会一直起着作用你无须自己来考虑内存的管理。ARC会在类的实例不再被使用时自动释放其占用的内存。</p>
<p>然而在少数情况下ARC为了能帮助你管理内存需要更多的关于你的代码之间关系的信息。本章描述了这些情况并且为你示范怎样启用ARC来管理你的应用程序的内存。</p>
<blockquote>
<p>注意: 引用计数仅仅应用于类的实例。结构体和枚举类型是值类型,不是引用类型,也不是通过引用的方式存储和传递。</p>
</blockquote>
<h2 id="-">自动引用计数的工作机制</h2>
<p>当你每次创建一个类的新的实例的时候ARC会分配一大块内存用来储存实例的信息。内存中会包含实例的类型信息以及这个实例所有相关属性的值。此外当实例不再被使用时ARC释放实例所占用的内存并让释放的内存能挪作他用。这确保了不再被使用的实例不会一直占用内存空间。</p>
<p>然而当ARC收回和释放了正在被使用中的实例该实例的属性和方法将不能再被访问和调用。实际上如果你试图访问这个实例你的应用程序很可能会崩溃。</p>
<p>为了确保使用中的实例不会被回收ARC会跟踪和计算每一个类实例正在被多少属性常量和变量所引用。哪怕实例的引用数为一ARC都不会回收这个实例。</p>
<p>为了使之成为可能,无论你将类实例赋值给属性,常量或者是变量,属性,常量或者变量,都会对此实例创建强引用。之所以称之为强引用,是因为它会将实例牢牢的保持住,只要强引用还在,实例是不允许被释放的。</p>
<h2 id="-">自动引用计数实践</h2>
</section>
</div>
</div>
</div>

View File

@ -46,7 +46,7 @@
<div class="book" data-level="2.17" data-basepath=".." data-revision="1401968172845">
<div class="book" data-level="2.17" data-basepath=".." data-revision="1401977527536">
<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>

View File

@ -46,7 +46,7 @@
<div class="book" data-level="2.18" data-basepath=".." data-revision="1401968172845">
<div class="book" data-level="2.18" data-basepath=".." data-revision="1401977527536">
<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>

View File

@ -46,7 +46,7 @@
<div class="book" data-level="2.19" data-basepath=".." data-revision="1401968172845">
<div class="book" data-level="2.19" data-basepath=".." data-revision="1401977527536">
<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>
@ -576,6 +576,69 @@
<div class="page-inner">
<section class="normal" id="section-gitbook_25">
<h1 id="-">类型嵌套</h1>
<p>枚举类型常被用于实现特定类或结构体的功能。也能够在有多种变量类型的环境中方便地定义通用类或结构体来使用为了实现这种功能Swift允许你定义类型嵌套可以在枚举类型、类和结构体中定义支持嵌套的类型。</p>
<p>要在一个类型中嵌套另一个类型,将需要嵌套的类型的定义写在被嵌套类型的区域{}内,而且可以根据需要定义多级嵌套。</p>
<h2 id="-">类型嵌套实例</h2>
<p>下面这个例子定义了一个结构体<code>BlackjackCard</code>(二十一点),用来模拟<code>BlackjackCard</code>中的扑克牌点数。<code>BlackjackCard</code>结构体包含2个嵌套定义的枚举类型<code>Suit</code><code>Rank</code></p>
<p><code>BlackjackCard</code>规则中,<code>Ace</code>牌可以表示1或者11<code>Ace</code>牌的这一特征用一个嵌套在枚举型<code>Rank</code>的结构体<code>Values</code>来表示。</p>
<pre><code>struct BlackjackCard {
// 嵌套定义枚举型Suit
enum Suit: Character {
case Spades = &quot;&quot;, Hearts = &quot;&quot;, Diamonds = &quot;&quot;, Clubs = &quot;&quot;
}
// 嵌套定义枚举型Rank
enum Rank: Int {
case Two = 2, Three, Four, Five, Six, Seven, Eight, Nine, Ten
case Jack, Queen, King, Ace
struct Values {
let first: Int, second: Int?
}
var values: Values {
switch self {
case .Ace:
return Values(first: 1, second: 11)
case .Jack, .Queen, .King:
return Values(first: 10, second: nil)
default:
return Values(first: self.toRaw(), second: nil)
}
}
}
// BlackjackCard 的属性和方法
let rank: Rank, suit: Suit
var description: String {
var output = &quot;suit is \(suit.toRaw()),&quot;
output += &quot; value is \(rank.values.first)&quot;
if let second = rank.values.second {
output += &quot; or \(second)&quot;
}
return output
}
}
</code></pre><p>枚举型的<code>Suit</code>用来描述扑克牌的四种花色,并分别用一个<code>Character</code>类型的值代表花色符号。</p>
<p>枚举型的<code>Rank</code>用来描述扑克牌从<code>Ace</code>~10,<code>J</code>,<code>Q</code>,<code>K</code>,13张牌并分别用一个<code>Int</code>类型的值表示牌的面值。(这个<code>Int</code>类型的值不适用于<code>Ace</code>,<code>J</code>,<code>Q</code>,<code>K</code>的牌)。</p>
<p>如上文所提到的,枚举型<code>Rank</code>在自己内部定义了一个嵌套结构体<code>Values</code>。这个结构体包含两个变量,只有<code>Ace</code>有两个数值,其余牌都只有一个数值。结构体<code>Values</code>中定义的两个属性:</p>
<p><code>first</code>, 为<code>Int</code>
<code>second</code>, 为 <code>Int?</code>, 或 “optional <code>Int</code></p>
<p><code>Rank</code>定义了一个计算属性<code>values</code>,这个计算属性会根据牌的面值,用适当的数值去初始化<code>Values</code>实例,并赋值给<code>values</code>。对于<code>J</code>,<code>Q</code>,<code>K</code>,<code>Ace</code>会使用特殊数值,对于数字面值的牌使用<code>Int</code>类型的值。</p>
<p><code>BlackjackCard</code>结构体自身有两个属性—<code>rank</code><code>suit</code>,也同样定义了一个计算属性<code>description</code><code>description</code>属性用<code>rank</code><code>suit</code>的中内容来构建对这张扑克牌名字和数值的描述,并用可选类型<code>second</code>来检查是否存在第二个值,若存在,则在原有的描述中增加对第二数值的描述。</p>
<p>因为<code>BlackjackCard</code>是一个没有自定义构造函数的结构体,在<a href="https://github.com/CocoaChina-editors/Welcome-to-Swift/blob/master/The%20Swift%20Programming%20Language/02Language%20Guide/14Initialization.md" target="_blank">Memberwise Initializers for Structure Types</a>中知道结构体有默认的成员构造函数,所以你可以用默认的<code>initializer</code>去初始化新的常量<code>theAceOfSpades</code>:</p>
<pre><code>let theAceOfSpades = BlackjackCard(rank: .Ace, suit: .Spades)
println(&quot;theAceOfSpades: \(theAceOfSpades.description)&quot;)
// 打印出 &quot;theAceOfSpades: suit is ♠, value is 1 or 11&quot;
</code></pre><p>尽管<code>Rank</code><code>Suit</code>嵌套在<code>BlackjackCard</code>中,但仍可被引用,所以在初始化实例时能够通过枚举类型中的成员名称单独引用。在上面的例子中<code>description</code>属性能正确得输出对<code>Ace</code>牌有1和11两个值。</p>
<h2 id="-">类型嵌套的引用</h2>
<p>在外部对嵌套类型的引用,以被嵌套类型的名字为前缀,加上所要引用的属性名:</p>
<pre><code>let heartsSymbol = BlackjackCard.Suit.Hearts.toRaw()
// 红心的符号 为 &quot;&quot;
</code></pre><p>对于上面这个例子,这样可以使<code>Suit</code>, <code>Rank</code>, 和 <code>Values</code>的名字尽可能的短,因为它们的名字会自然的由被定义的上下文来限定。</p>
</section>
</div>
</div>
</div>

View File

@ -46,7 +46,7 @@
<div class="book" data-level="2.20" data-basepath=".." data-revision="1401968172845">
<div class="book" data-level="2.20" data-basepath=".." data-revision="1401977527536">
<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>

View File

@ -46,7 +46,7 @@
<div class="book" data-level="2.21" data-basepath=".." data-revision="1401968172845">
<div class="book" data-level="2.21" data-basepath=".." data-revision="1401977527536">
<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>

View File

@ -46,7 +46,7 @@
<div class="book" data-level="2.22" data-basepath=".." data-revision="1401968172845">
<div class="book" data-level="2.22" data-basepath=".." data-revision="1401977527536">
<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>

View File

@ -46,7 +46,7 @@
<div class="book" data-level="2.23" data-basepath=".." data-revision="1401968172845">
<div class="book" data-level="2.23" data-basepath=".." data-revision="1401977527536">
<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>

View File

@ -46,7 +46,7 @@
<div class="book" data-level="2" data-basepath=".." data-revision="1401968172845">
<div class="book" data-level="2" data-basepath=".." data-revision="1401977527536">
<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>
@ -576,7 +576,7 @@
<div class="page-inner">
<section class="normal" id="section-gitbook_37">
<section class="normal" id="section-gitbook_30">
<h1 id="swift-">Swift 教程</h1>
<p>本章介绍了 Swift 的各种特性及其使用方法,是全书的核心部分。</p>