diff --git a/chapter1/01_swift.html b/chapter1/01_swift.html index bc3ed143..0a91c891 100644 --- a/chapter1/01_swift.html +++ b/chapter1/01_swift.html @@ -46,7 +46,7 @@ -
Swift 是一种新的编程语言,用于编写 iOS 和 OS X 应用程序。Swift 结合了 C 和 Objective-C 的优点并且不受C的兼容性的限制。Swift 使用安全的编程模式并添加了很多新特性,这将使编程更简单,扩展性更强,也更有趣。除此之外,Swift 还支持人见人爱的 Cocoa 和 Cocoa Touch 框架。拥有了这些特性,Swift将重新定义软件开发。
@@ -603,8 +604,8 @@ - - + + diff --git a/chapter1/02_a_swift_tour.html b/chapter1/02_a_swift_tour.html index 410189c5..ec4ed62e 100644 --- a/chapter1/02_a_swift_tour.html +++ b/chapter1/02_a_swift_tour.html @@ -46,7 +46,7 @@ -本页内容包括:
@@ -1109,8 +1110,8 @@ anyCommonElements([1, 2, 3], [3]) - - + + diff --git a/chapter1/chapter1.html b/chapter1/chapter1.html index dfd99082..fef3b374 100644 --- a/chapter1/chapter1.html +++ b/chapter1/chapter1.html @@ -46,7 +46,7 @@ -在本章中您将了解 Swift 的特性和开发历史,并对 Swift 有一个初步的了解。
@@ -598,8 +599,8 @@ - - + + diff --git a/chapter2/01_The_Basics.html b/chapter2/01_The_Basics.html index 73da538e..451accc6 100644 --- a/chapter2/01_The_Basics.html +++ b/chapter2/01_The_Basics.html @@ -46,7 +46,7 @@ -Swift 是 iOS 和 OS X 应用开发的一门新语言。然而,如果你有 C 或者 Objective-C 开发经验的话,你会发现 Swift 的很多内容都是你熟悉的。
@@ -771,6 +772,188 @@ let pi = Double(three) + pointOneFourOneFiveNine当用这种方式来初始化一个新的整数值时,浮点值会被截断。也就是说4.75会变成4,-3.9会变成3。
+注意:结合数字类常量和变量不同于结合数字类原始值。原始值
+3可以直接和原始值0.14159相加,因为数字原始值本身没有明确的类型。它们的类型只在编译器需要求值的时候被推测。
类型别名就是给现有类型定义一个可选名字。你可以使用typealias关键字来定义类型别名。
当你想要给现有类型起一个更有意义的名字时,类型别名非常有用。假设你正在处理特定长度的外部资源的数据:
+typealias AudioSample = UInt16
+定义了一个类型别名之后,你可以在任何使用原始名的地方使用别名:
+var maxAmplitudeFound = AudioSample.min
+// maxAmplitudeFound 现在是 0
+本例中,AudioSample被定义为UInt16的一个别名。因为它是别名,AudioSample.min实际上是UInt16.min,所以会给maxAmplitudeFound赋一个初值0。
Swift 有一个基本的布尔类型,叫做Bool。布尔值是指逻辑,因为它们只能是真或者假。Swift 有两个布尔常量,true和false:
let orangesAreOrange = true
+let turnipsAreDelicious = false
+orangesAreOrange和turnipsAreDelicious的类型会被推测为Bool,因为它们的初值是布尔原始值。就像之前提到的Int和Double一样,如果你创建变量的时候给它们赋值true或者false,那你不需要给常量或者变量标明Bool类型。初始化常量或者变量的时候如果所赋的值类型已知,就可以触发类型推测,这让 Swift 代码更加简洁并且可读性更高。
当你编写条件语句比如if语句的时候,布尔值非常有用:
if turnipsAreDelicious {
+ println("Mmm, tasty turnips!")
+} else {
+ println("Eww, turnips are horrible.")
+}
+// 输出 "Eww, turnips are horrible."
+条件语句比如if语句的详细介绍参见控制流(待添加链接)。
如果你在需要使用Bool类型的地方使用了非布尔值,Swift 的类型安全机制会报错。下面的例子会报告一个编译时错误:
let i = 1
+if i {
+ // 这个例子不会通过编译,会报错
+}
+然而,下面的例子是合法的:
+let i = 1
+if i == 1 {
+ // 这个例子会编译成功
+}
+i == 1的比较结果是Bool类型,所以第二个例子可以通过类型检查。类似i == 1这样的比较会在基本操作符(待添加链接)中详细讨论。
和 Swift 中的其他类型安全的例子一样,这个方法可以避免错误并保证这块代码的作用总是在意料之中。
+元组把多个值组合成一个复合值。元组内的值可以使任意类型,并不要求是相同类型。
+下面这个例子中,(404, "Not Found")是一个描述 HTTP 状态码的元组。HTTP 状态码是当你请求网页的时候 web 服务器返回的一个特殊值。如果你请求的网页不存在就会返回一个404 Not Found状态码。
let http404Error = (404, "Not Found")
+// http404Error 的类型是 (Int, String),值是 (404, "Not Found")
+(404, "Not Found")元组把一个Int值和一个String值组合起来表示 HTTP 状态码的两个部分:一个数字和一个可以读懂的描述。这个元组可以被描述为“一个类型为(Int, String)的元组”。
你可以把任意顺序的类型组合成一个元组,这个元组可以包含所有类型。只要你想,你可以创建一个类型为(Int, Int, Int)或者(String, Bool)或者包含其他类型的元组。
你可以将一个元组的内容分解成单独的常量和变量,然后你就可以正常使用它们了:
+let (statusCode, statusMessage) = http404Error
+println("The status code is \(statusCode)")
+// 输出 "The status code is 404"
+println("The status message is \(statusMessage)")
+// 输出 "The status message is Not Found"
+如果你只需要一部分元组值,分解的时候可以把要忽略的部分设置成_:
let (justTheStatusCode, _) = http404Error
+println("The status code is \(justTheStatusCode)")
+// 输出 "The status code is 404"
+此外,你还可以通过下标来访问元组中的单个元素,下标从零开始:
+println("The status code is \(http404Error.0)")
+// 输出 "The status code is 404"
+println("The status message is \(http404Error.1)")
+// 输出 "The status message is Not Found"
+你可以在定义元组的时候给单个元素命名:
+let http200Status = (statusCode: 200, description: "OK")
+给元组中的元素命名后,你可以通过名字来获取这些元素的值:
+println("The status code is \(http200Status.statusCode)")
+// 输出 "The status code is 200"
+println("The status message is \(http200Status.description)")
+// 输出 "The status message is OK"
+作为函数返回值时,元组非常有用。一个用来获取网页的函数可能会返回一个(Int, String)元组来描述是否获取成功。和只能返回一个类型的值比较起来,一个包含两个不同类型值的元组可以让函数的返回信息更有用。详情参见返回多个值的函数(待添加链接)。
++注意:元组在临时组织值的时候很有用,但是并不适合创建复杂的数据结构。如果你的数据结构并不是临时使用,请使用类或者结构体而不是元组。详情参见
+类和结构体(待添加链接)。
使用可选来处理值可能缺失的情况。可选表示:
+或者
+++注意:C 和 Objective-C 中并没有可选这个概念。最接近的是 Objective-C 中的一个特性,一个方法要不返回一个对象要不返回
+nil,nil表示“缺少一个合法的对象”。然而,这只对对象起作用——对于结构体,基本的 C 类型或者美剧类型不起作用。对于这些类型,Objective-C 方法一般会返回一个特殊值(比如NSNotFound)来暗示值缺失。这种方法假设方法的调用者知道并记得对特殊值进行判断。然而,Swift 的可选可以让你暗示任意类型的值缺失,并不需要一个特殊值。
来看一个例子。Swift 的String类型有一个叫做toInt的方法,作用是将一个String值转换成一个Int值。然而,并不是所有的字符串都可以转换成一个整数。字符串"123"可以被转换成数字123,但是字符串"hello, world"不行。
下面的例子使用toInt方法来尝试将一个String转换成Int:
let possibleNumber = "123"
+let convertedNumber = possibleNumber.toInt()
+// convertedNumber 被推测为类型 "Int?", 或者类型 "optional Int"
+因为toInt方法可能会失败,所以它返回一个可选的Int,而不是一个Int。一个可选的Int被写作Int?而不是Int。问号暗示包含的值是可选,也就是说可能包含Int值也可能不包含值。(不能包含其他任何值比如Bool值或者String值。只能是Int或者什么都没有。)
你可以使用if语句来判断一个可选是否包含值。如果可选有值,结果是true;如果没有值,结果是false。
当你确定可选包含值之后,你可以在可选的名字后面加一个!来获取值。这个惊叹号表示“我知道这个可选有值,请使用它。”这被称为可选值的强制解析:
if convertedNumber {
+ println("\(possibleNumber) has an integer value of \(convertedNumber!)")
+} else {
+ println("\(possibleNumber) could not be converted to an integer")
+}
+// 输出 "123 has an integer value of 123"
+更多关于if语句的内容参见控制流(待添加链接)。
++注意:使用
+!来获取一个不存在的可选值会导致运行时错误。。使用!来强制解析值之前,一定要确定可选包含一个非nil的值。
使用可选绑定来判断可选是否包含值,如果包含就把值赋给一个临时常量或者变量。可选绑定可以用在if和while语句中来对可选的值进行判断并把值赋给一个常量或者变量。if和while语句详情参见控制流。
像下面这样写一个可选绑定:
+if let constantName = someOptional {
+ statements
+}
+你可以像上面这样使用可选绑定来重写possibleNumber这个例子:
if let actualNumber = possibleNumber.toInt() {
+ println("\(possibleNumber) has an integer value of \(actualNumber)")
+} else {
+ println("\(possibleNumber) could not be converted to an integer")
+}
+// 输出 "123 has an integer value of 123"
+这段代码可以被理解为:
+“如果possibleNumber.toInt返回的可选Int包含一个值,创建一个叫做actualNumber的新常量并将可选包含的值赋给它。”
如果转换成功,actualNumber常量可以在if语句的第一个分支中使用。它已经被可选包含的值初始化过,所以不需要再使用!后缀来获取它的值。在这个例子中,actualNumber只被用来输出转换结果。
你可以在可选绑定中使用常量和变量。如果你想在if语句的第一个分支中操作actualNumber的值,你可以改成if var actualNumber,这样可选包含的值就会被赋给一个变量。
你可以给可选变量赋值为nil来表示它没有值:
var serverResponseCode: Int? = 404
+// serverResponseCode 包含一个可选的 Int 值 404
+serverResponseCode = nil
+// serverResponseCode 现在不包含值
+++注意:
+nil不能用于非可选的常量和变量。如果你的代码中有常量或者变量需要处理值缺失的情况,请把它们声明成对应的可选类型。
如果你声明一个可选常量或者变量但是没有赋值,它们会自动被设置为nil:
var surveyAnswer: String?
+// surveyAnswer 被自动设置为 nil
+++注意:Swift 的
+nil和 Objective-C 中的nil并不一样。在 Objective-C 中,nil是一个指向不存在对象的指针。在 Swift 中,nil不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选都可以被设置为nil,不只是对象类型。
如上所述,可选暗示了常量或者变量可以“没有值”。可选可以通过if语句来判断是否有值,如果有值的话可以通过可选绑定来解析值。
有时候在程序架构中,第一次被赋值之后,可以确定一个可选总会有值。在这种情况下,每次都要判断和解析可选值是非常低效的,因为可以确定它总会有值。
+这种类型的可选被定义为隐式解析可选。把后缀?改成!来声明一个隐式解析可选,比如String!。
当可选被第一次赋值之后就可以确定之后一直有值的时候,隐式解析可选非常有用。隐式解析可选主要被用在 Swift 中类的构造过程中,详情参见无主引用和隐式解析可选属性(Unowned References and Implicitly Unwrapped Optional Properties待添加链接)。
一个隐式解析可选其实就是一个普通的可选,但是可以被当做非可选来使用,并不需要每次都使用解析来获取可选值。下面的例子展示了可选String和隐式解析可选String之间的区别:
let possibleString: String? = "An optional string."
+println(possibleString!) // 需要惊叹号来获取值
+// 输出 "An optional string."
+
+let assumedString: String! = "An implicitly unwrapped optional string."
+println(assumedString) // 不需要惊叹号
+// 输出 "An implicitly unwrapped optional string."
+你可以把隐式解析可选当做一个可以自动解析的可选。你要做的只是声明的时候把惊叹号放到类型的结尾,而不是每次获取值的变量结尾。
+++注意:如果你在隐式解析可选没有值的时候尝试获取,会触发运行时错误。和你在没有值的普通可选后面加一个惊叹号一样。
+
你仍然可以把隐式解析可选当做普通可选来判断它是否包含值: + if assumedString { + println(assumedString) + } + // 输出 "An implicitly unwrapped optional string."
+你也可以在可选绑定中使用隐式解析可选来检查并解析它的值: + if let definiteString = assumedString { + println(definiteString) + } + // 输出 "An implicitly unwrapped optional string."
+++注意:如果一个变量之后可能变成
+nil的话请不要使用隐式解析可选。如果你需要在变量的生命周期中判断是否是nil的话,请使用普通可选类型。
可选可以让你判断值是否存在,你可以在代码中优雅地处理值缺失的情况。然而,在某些情况下,如果值缺失或者值并不满足特定的条件,你的代码可能并不需要继续执行。这时,你可以在你的代码中触发一个断言来结束代码运行并通过调试来找到值缺失的原因。
+断言会在运行时判断一个逻辑条件是否为true。从字面意思来说,断言“断言”一个条件是否为真。你可以使用断言来保证在运行其他代码之前,某些重要的条件已经被满足。如果条件判断为true,代码运行会继续进行;如果条件判断为false,代码运行停止,你的应用被终止。
如果你的代码在调试环境下触发了一个断言,比如你在 Xcode 中构建并运行一个应用,你可以清楚地看到不合法的状态发生在哪里并检查断言被触发时你的应用的状态。此外,断言允许你附加一条调试信息。
+你可以使用全局assert函数来写一个断言。给assert函数传入一个结果为true或者false的表达式以及一条信息,当表达式为false的时候这条信息会被显示:
let age = -3
+assert(age >= 0, "A person's age cannot be less than zero")
+// 因为 age < 0,所以断言会触发
+在这个例子中,只有age >= 0为true的时候代码运行才会继续,也就是说,当age的值非负的时候。如果age的值是负数,就像代码中那样,age >= 0为false,断言被触发,结束应用。
断言信息不能使用字符串插值。断言信息可以省略,就像这样:
+assert(age >= 0)
+当条件可能为假时使用断言,但是最终一定要保证条件为真,这样你的代码才能继续运行。断言的适用情景:
+nil,但是后面的代码运行需要一个非nil值。查看下标(链接待添加)和函数(链接待添加)。
+@@ -791,8 +974,8 @@ let pi = Double(three) + pointOneFourOneFiveNine - - + + diff --git a/chapter2/02_Basic_Operators.html b/chapter2/02_Basic_Operators.html index 1a333cfb..162391d2 100644 --- a/chapter2/02_Basic_Operators.html +++ b/chapter2/02_Basic_Operators.html @@ -46,7 +46,7 @@ -注意:断言可能导致你的应用终止运行,所以你应当仔细设计你的代码来让非法条件不会出现。然而,在你的应用发布之前,有时候非法条件可能出现,这时使用断言可以快速发现问题。
String 是一个有序的字符集合,例如 "hello, world", "albatross"。 @@ -846,8 +847,8 @@ print("\n") - - + + diff --git a/chapter2/04_Collection_Types.html b/chapter2/04_Collection_Types.html index a2e8596d..fe71406e 100644 --- a/chapter2/04_Collection_Types.html +++ b/chapter2/04_Collection_Types.html @@ -46,7 +46,7 @@ -
函数是用来完成特定任务的独立的代码块。你给一个函数起一个合适的名字,用来标示函数做什么,并且当函数需要执行的时候,这个名字会被“调用”。
@@ -624,8 +625,8 @@ - - + + diff --git a/chapter2/07_Closures.html b/chapter2/07_Closures.html index df970c89..5c48f904 100644 --- a/chapter2/07_Closures.html +++ b/chapter2/07_Closures.html @@ -46,7 +46,7 @@ -闭包是功能性自包含模块,可以在代码中被传递和使用。 @@ -827,8 +828,8 @@ alsoIncrementByTen() - - + + diff --git a/chapter2/08_Enumerations.html b/chapter2/08_Enumerations.html index 4e090e9e..f23347a2 100644 --- a/chapter2/08_Enumerations.html +++ b/chapter2/08_Enumerations.html @@ -46,7 +46,7 @@ -
Swift使用自动引用计数(ARC)这一机制来跟踪和管理你的应用程序的内存。通常情况下,Swift的内存管理机制会一直起着作用,你无须自己来考虑内存的管理。ARC会在类的实例不再被使用时,自动释放其占用的内存。
@@ -608,8 +609,8 @@ - - + + diff --git a/chapter2/17_Optional_Chaining.html b/chapter2/17_Optional_Chaining.html index a7084120..9282d202 100644 --- a/chapter2/17_Optional_Chaining.html +++ b/chapter2/17_Optional_Chaining.html @@ -46,7 +46,7 @@ -枚举类型常被用于实现特定类或结构体的功能。也能够在有多种变量类型的环境中,方便地定义通用类或结构体来使用,为了实现这种功能,Swift允许你定义类型嵌套,可以在枚举类型、类和结构体中定义支持嵌套的类型。
@@ -653,8 +654,8 @@ println("theAceOfSpades: \(theAceOfSpades.description)") - - + + diff --git a/chapter2/20_Extensions.html b/chapter2/20_Extensions.html index 82fae1d3..be67de92 100644 --- a/chapter2/20_Extensions.html +++ b/chapter2/20_Extensions.html @@ -46,7 +46,7 @@ -本章介绍了 Swift 的各种特性及其使用方法,是全书的核心部分。
@@ -598,8 +599,8 @@ - - + + diff --git a/chapter3/01_About_the_Language_Reference.html b/chapter3/01_About_the_Language_Reference.html index fa39c8d3..b9a42903 100644 --- a/chapter3/01_About_the_Language_Reference.html +++ b/chapter3/01_About_the_Language_Reference.html @@ -46,7 +46,7 @@ -本书的这一节描述了Swift编程语言的形式语法。这里描述的语法是为了帮助您更详细的了解该语言,而不是让您直接实现一个解析器或编译器。
@@ -623,8 +624,8 @@ - - + + diff --git a/chapter3/02_Lexical_Structure.html b/chapter3/02_Lexical_Structure.html index 78a0e0f6..6ecabfd6 100644 --- a/chapter3/02_Lexical_Structure.html +++ b/chapter3/02_Lexical_Structure.html @@ -46,7 +46,7 @@ -Swift 是苹果在 WWDC 2014 上发布的一款全新的编程语言,本书译自苹果官方的 Swift 教程《The Swift Programming Language》。
@@ -595,8 +596,8 @@ - - + + @@ -624,20 +625,4 @@ require(["gitbook"], function(gitbook) { - - - - - - - - -