diff --git a/chapter1/01_swift.html b/chapter1/01_swift.html index 80a35e7c..49b241c2 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将重新定义软件开发。
diff --git a/chapter1/02_a_swift_tour.html b/chapter1/02_a_swift_tour.html index e54b7953..9b197b95 100644 --- a/chapter1/02_a_swift_tour.html +++ b/chapter1/02_a_swift_tour.html @@ -46,7 +46,7 @@ -通常来说,编程语言教程中的第一个程序应该在屏幕上打印“Hello, world”。在 Swift 中,可以用一行代码实现:
@@ -783,8 +783,7 @@ hasAnyMatches(numbers, lessThanTen)练习:重写闭包,对所有奇数返回0.
有很多种创建闭包的方法。如果一个闭包的类型已知,比如作为一个回调函数,你可以忽略参数的类型和返回值。单个语句闭包会把它语句的值当做结果返回。
-numbers.map({ number in 3 * number})
-你可以获取参数的数量——这个方法在非常短的闭包中很有用。一个被作为最后一个参数传入函数的时候可以直接出现在括号后面。
+你可以获取参数的数量——这个方法在非常短的闭包中很有用。一个被作为最后一个参数传入函数的时候可以直接出现在括号后面。
sort([1, 5, 3, 12, 2]) { $0 > $1 }
使用class和类名来创建一个类。类中属性的声明和常量、变量声明一样,唯一的区别就是它们的上下文是类。同样,方法和函数声明也一样。
在本章中您将了解 Swift 的特性和开发历史,并对 Swift 有一个初步的了解。
diff --git a/chapter2/01_The_Basics.html b/chapter2/01_The_Basics.html index b42d6112..b610c725 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 的很多内容都是你熟悉的。
@@ -661,41 +661,7 @@ this is the end of the first multiline comment */与其他大部分编程语言不同,Swift 并不强制要求你在每条语句的结尾处使用分号(;),当然,你也可以按照你自己的习惯添加分号。有一种情况下必须要用分号,即你打算在同一行内写多条独立的语句:
let cat = "🐱"; println(cat)
// prints "🐱"
-整数就是没有小数部分的数字,比如42和23。整数分有符号(正、负、零)或者无符号(正、零)两种。
Swift 提供了8、16、32和64位的有符号和无符号整数。这些整数和 C 的命名习惯很像,比如8位无符号整数类型是UInt8,32位有符号整数类型是Int32。就像 Swift 的其他类型一样,这些整数类型的名字使用大写字母来命名。
你可以访问每个整数类型的min和max属性来获取这个类型的最小值和最大值:
let minValue = UInt8.min // UInt8 类型的 minValue 等于0
-let maxValue = UInt8.max // UInt8 类型的 maxValue 等于255
-这两个值的类型和右侧的整数类型是相同的(比如例子中的UInt8),因此你可以在表达式中把它们和同类型的值一同使用。
大多数情况下,你并不需要指定整数长度。Swift 提供了一个特别的整数类型Int,这个类型的长度和当前平台的原生字长一样:
Int和Int32长度相同Int和Int64长度相同一般来说,最好使用Int类型,除非你需要指定整数长度。这可以保证代码的一致性和可复用性。即使在32位平台上,Int也可以存储范围为-2147483648~2147483647的整数,大多数时候这已经够用了。
Swift 还提供了一个无符号整数类型UInt,这个类型的长度和当前平台的原生字长一样:
UInt和UInt32长度相同UInt和UInt64长度相同--注意:只在你需要使用无符号整数类型并且长度和平台原生字长相同的时候才使用
-Uint。如果不是这种情况,最好使用Int,即使要存储的值已知是非负数。使用Int可以保证代码的可复用性,避免不同类型之间的转换,并且符合整数类型推测,详情请见类型安全和类型推测(待添加链接)。
浮点数是有小数部分的数字,比如3.14159,0.1和-273.15。
浮点类型可以表示的数字范围比整数类型要大,因此可以存储比Int类型更大或者更小的数字。Swift 提供了两种有符号浮点数类型:
Double表示64位浮点数。当浮点值非常大或者需要非常准确的时候使用此类型。Float表示32位浮点数。当浮点值不需要使用Double的时候使用此类型。-- +注意:
-Double的准确程度是至少15个十进制数字,而Float的准确程度是至少6个十进制数字。到底选择哪个浮点类型取决于你要存储的值。
String 是一个有序的字符集合,例如 "hello, world", "albatross"。Swift 字符串通过 String 类型来表示,也可以表示为 Character 类型值的集合。
diff --git a/chapter2/04_Collection_Types.html b/chapter2/04_Collection_Types.html index 14e380a0..ab6e645b 100644 --- a/chapter2/04_Collection_Types.html +++ b/chapter2/04_Collection_Types.html @@ -46,7 +46,7 @@ -函数是用来完成特定任务的独立的代码块。你给一个函数起一个合适的名字,用来标示函数做什么,并且当函数需要执行的时候,这个名字会被“调用”。
diff --git a/chapter2/07_Closures.html b/chapter2/07_Closures.html index 921df726..cd12186a 100644 --- a/chapter2/07_Closures.html +++ b/chapter2/07_Closures.html @@ -46,7 +46,7 @@ -Swift使用自动引用计数这一机制(ARC)来跟踪和管理你的应用程序的内存。通常情况下,Swift的内存管理机制会一直起着作用,你无须自己来考虑内存的管理。ARC会在类的实例不再被使用时,自动释放其占用的内存。
+然而,在少数情况下,ARC为了能帮助你管理内存,需要更多的关于你的代码之间关系的信息。本章描述了这些情况,并且为你示范怎样启用ARC来管理你的应用程序的内存。
+++注意: 引用计数仅仅应用于类的实例。结构体和枚举类型是值类型,不是引用类型,也不是通过引用的方式存储和传递。
+
当你每次创建一个类的新的实例的时候,ARC会分配一大块内存用来储存实例的信息。内存中会包含实例的类型信息,以及这个实例所有相关属性的值。此外,当实例不再被使用时,ARC释放实例所占用的内存,并让释放的内存能挪作他用。这确保了不再被使用的实例,不会一直占用内存空间。
+然而,当ARC收回和释放了正在被使用中的实例,该实例的属性和方法将不能再被访问和调用。实际上,如果你试图访问这个实例,你的应用程序很可能会崩溃。
+为了确保使用中的实例不会被回收,ARC会跟踪和计算每一个类实例正在被多少属性,常量和变量所引用。哪怕实例的引用数为一,ARC都不会回收这个实例。
+为了使之成为可能,无论你将类实例赋值给属性,常量或者是变量,属性,常量或者变量,都会对此实例创建强引用。之所以称之为强引用,是因为它会将实例牢牢的保持住,只要强引用还在,实例是不允许被释放的。
+枚举类型常被用于实现特定类或结构体的功能。也能够在有多种变量类型的环境中,方便地定义通用类或结构体来使用,为了实现这种功能,Swift允许你定义类型嵌套,可以在枚举类型、类和结构体中定义支持嵌套的类型。
+要在一个类型中嵌套另一个类型,将需要嵌套的类型的定义写在被嵌套类型的区域{}内,而且可以根据需要定义多级嵌套。
+下面这个例子定义了一个结构体BlackjackCard(二十一点),用来模拟BlackjackCard中的扑克牌点数。BlackjackCard结构体包含2个嵌套定义的枚举类型Suit 和 Rank。
在BlackjackCard规则中,Ace牌可以表示1或者11,Ace牌的这一特征用一个嵌套在枚举型Rank的结构体Values来表示。
struct BlackjackCard {
+ // 嵌套定义枚举型Suit
+ enum Suit: Character {
+ case Spades = "♠", Hearts = "♡", Diamonds = "♢", Clubs = "♣"
+ }
+ // 嵌套定义枚举型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 = "suit is \(suit.toRaw()),"
+ output += " value is \(rank.values.first)"
+ if let second = rank.values.second {
+ output += " or \(second)"
+ }
+ return output
+ }
+}
+枚举型的Suit用来描述扑克牌的四种花色,并分别用一个Character类型的值代表花色符号。
枚举型的Rank用来描述扑克牌从Ace~10,J,Q,K,13张牌,并分别用一个Int类型的值表示牌的面值。(这个Int类型的值不适用于Ace,J,Q,K的牌)。
如上文所提到的,枚举型Rank在自己内部定义了一个嵌套结构体Values。这个结构体包含两个变量,只有Ace有两个数值,其余牌都只有一个数值。结构体Values中定义的两个属性:
first, 为Int
+second, 为 Int?, 或 “optional Int”
Rank定义了一个计算属性values,这个计算属性会根据牌的面值,用适当的数值去初始化Values实例,并赋值给values。对于J,Q,K,Ace会使用特殊数值,对于数字面值的牌使用Int类型的值。
BlackjackCard结构体自身有两个属性—rank与suit,也同样定义了一个计算属性description,description属性用rank和suit的中内容来构建对这张扑克牌名字和数值的描述,并用可选类型second来检查是否存在第二个值,若存在,则在原有的描述中增加对第二数值的描述。
因为BlackjackCard是一个没有自定义构造函数的结构体,在Memberwise Initializers for Structure Types中知道结构体有默认的成员构造函数,所以你可以用默认的initializer去初始化新的常量theAceOfSpades:
let theAceOfSpades = BlackjackCard(rank: .Ace, suit: .Spades)
+println("theAceOfSpades: \(theAceOfSpades.description)")
+// 打印出 "theAceOfSpades: suit is ♠, value is 1 or 11"
+尽管Rank和Suit嵌套在BlackjackCard中,但仍可被引用,所以在初始化实例时能够通过枚举类型中的成员名称单独引用。在上面的例子中description属性能正确得输出对Ace牌有1和11两个值。
在外部对嵌套类型的引用,以被嵌套类型的名字为前缀,加上所要引用的属性名:
+let heartsSymbol = BlackjackCard.Suit.Hearts.toRaw()
+// 红心的符号 为 "♡"
+对于上面这个例子,这样可以使Suit, Rank, 和 Values的名字尽可能的短,因为它们的名字会自然的由被定义的上下文来限定。
本章介绍了 Swift 的各种特性及其使用方法,是全书的核心部分。
diff --git a/chapter3/01_About_the_Language_Reference.html b/chapter3/01_About_the_Language_Reference.html index 2cfaa6ba..7689901e 100644 --- a/chapter3/01_About_the_Language_Reference.html +++ b/chapter3/01_About_the_Language_Reference.html @@ -46,7 +46,7 @@ -本书的这一节描述了Swift编程语言的形式语法。这里描述的语法是为了帮助您更详细的了解该语言,而不是让您直接实现一个解析器或编译器。
+Swift语言相对小点,这是由于在Swift代码中几乎无处不在的许多常见的的类型,函数以及运算符都由Swift标准库来定义。虽然这些类型,函数和运算符不是Swift语言本身的一部分,但是它们被广泛用于这本书的讨论和代码范例。
+用来描述Swift编程语言形式语法的记法遵循下面几个约定:
+opt来标记。举个例子,getter-setter的语法块的定义如下:
+++GRAMMAR OF A GETTER-SETTER BLOCK
+getter-setter-block → { getter-clause setter-clauseopt } | { setter-clause getter-clause}
+
这个定义表明,一个getter-setter方法块可以由一个getter子句后跟一个可选的setter子句构成,用大括号括起来,或者由一个setter子句后跟一个getter子句构成,用大括号括起来。上述的文法产生等价于下面的两个产生,明确阐明如何二中择一:
+++GRAMMAR OF A GETTER-SETTER BLOCK
+getter-setter-block → { getter-clause setter-clauseopt }
+getter-setter-block → { setter-clause getter-clause}
+
================================================================ +上篇:高级操作符
+下篇:词法结构
+ + +