for 3.0
This commit is contained in:
@ -7,16 +7,18 @@
|
|||||||
|
|
||||||
> 2.0
|
> 2.0
|
||||||
> 翻译+校对:[xtymichael](https://github.com/xtymichael)
|
> 翻译+校对:[xtymichael](https://github.com/xtymichael)
|
||||||
|
>
|
||||||
|
> 3.0 翻译+校对:[shanks](http://codebuild.me),2016-10-06
|
||||||
|
|
||||||
Swift 是一种新的编程语言,用于编写 iOS,OS X 和 watchOS应用程序。Swift 结合了 C 和 Objective-C 的优点并且不受 C 兼容性的限制。Swift 采用安全的编程模式并添加了很多新特性,这将使编程更简单,更灵活,也更有趣。Swift 是基于成熟而且倍受喜爱的 Cocoa 和 Cocoa Touch 框架,它的降临将重新定义软件开发。
|
Swift 是一种新的编程语言,用于编写 iOS,MacOS, watchOS 和tvOS 的应用程序。Swift 结合了 C 和 Objective-C 的优点并且不受 C 兼容性的限制。Swift 采用安全的编程模式并添加了很多新特性,这将使编程更简单,更灵活,也更有趣。Swift 是基于成熟而且倍受喜爱的 Cocoa 和 Cocoa Touch 框架,它的降临将重新定义软件开发。
|
||||||
|
|
||||||
Swift 的开发从很久之前就开始了。为了给 Swift 打好基础,苹果公司改进了编译器,调试器和框架结构。我们使用自动引用计数(Automatic Reference Counting, ARC)来简化内存管理。我们在 Foundation 和 Cocoa 的基础上构建框架栈使其完全现代化和标准化。
|
Swift 的开发从很久之前就开始了。为了给 Swift 打好基础,苹果公司改进了编译器,调试器和框架结构。我们使用自动引用计数(Automatic Reference Counting, ARC)来简化内存管理。我们在 Foundation 和 Cocoa 的基础上构建框架栈使其完全现代化和标准化。
|
||||||
Objective-C 本身支持块、集合语法和模块,所以框架可以轻松支持现代编程语言技术。正是得益于这些基础工作,我们现在才能发布这样一个用于未来苹果软件开发的新语言。
|
Objective-C 本身支持块、集合语法和模块,所以框架可以轻松支持现代编程语言技术。正是得益于这些基础工作,我们现在才能发布这样一个用于未来苹果软件开发的新语言。
|
||||||
|
|
||||||
Objective-C 开发者对 Swift 并不会感到陌生。它采用了 Objective-C 的命名参数以及动态对象模型,可以无缝对接到现有的 Cocoa 框架,并且可以兼容 Objective-C 代码。在此基础之上,Swift 还有许多新特性并且支持过程式编程和面向对象编程。
|
Objective-C 开发者对 Swift 并不会感到陌生。它采用了 Objective-C 的命名参数以及动态对象模型,可以无缝对接到现有的 Cocoa 框架,并且可以兼容 Objective-C 代码。在此基础之上,Swift 还有许多新特性并且支持过程式编程和面向对象编程。
|
||||||
|
|
||||||
Swift 对于初学者来说也很友好。它是第一个既满足工业标准又像脚本语言一样充满表现力和趣味的脚本语言。它支持代码预览,这个革命性的特性可以允许程序员在不编译和运行应用程序的前提下运行 Swift 代码并实时查看结果。
|
Swift 对于初学者来说也很友好。它是第一个既满足工业标准又像脚本语言一样充满表现力和趣味的系统编程语言。它支持代码预览(playgrounds),这个革命性的特性可以允许程序员在不编译和运行应用程序的前提下运行 Swift 代码并实时查看结果。
|
||||||
|
|
||||||
Swift 将现代编程语言的精华和苹果工程师文化的智慧结合了起来。编译器对性能进行了优化,编程语言对开发进行了优化,两者互不干扰,鱼与熊掌兼得。Swift 既可以用于开发 “hello, world” 这样的小程序,也可以用于开发一套完整的操作系统。所有的这些特性让 Swift 对于开发者和苹果来说都是一项值得的投资。
|
Swift 将现代编程语言的精华和苹果工程师文化的智慧结合了起来。编译器对性能进行了优化,编程语言对开发进行了优化,两者互不干扰,鱼与熊掌兼得。Swift 既可以用于开发 “hello, world” 这样的小程序,也可以用于开发一套完整的操作系统。所有的这些特性让 Swift 对于开发者和苹果来说都是一项值得的投资。
|
||||||
|
|
||||||
Swift 是编写 iOS,OS X 和 watchOS应用的极佳手段,并将伴随着新的特性和功能持续演进。我们对 Swift 充满信心,你还在等什么!
|
Swift 是编写 iOS,MacOS,watchOS 和 tvOS 应用的极佳手段,并将伴随着新的特性和功能持续演进。我们对 Swift 充满信心,你还在等什么!
|
||||||
|
|||||||
@ -11,6 +11,9 @@
|
|||||||
|
|
||||||
> 2.2
|
> 2.2
|
||||||
> 翻译:[175](https://github.com/Brian175),2016-04-09 校对:[SketchK](https://github.com/SketchK),2016-05-11
|
> 翻译:[175](https://github.com/Brian175),2016-04-09 校对:[SketchK](https://github.com/SketchK),2016-05-11
|
||||||
|
>
|
||||||
|
> 3.0
|
||||||
|
> 翻译+校对:[shanks](http://codebuild.me),2016-10-06
|
||||||
|
|
||||||
本页内容包括:
|
本页内容包括:
|
||||||
|
|
||||||
@ -34,7 +37,7 @@ print("Hello, world!")
|
|||||||
这个教程会通过一系列编程例子来让你对 Swift 有初步了解,如果你有什么不理解的地方也不用担心——任何本章介绍的内容都会在后面的章节中详细讲解。
|
这个教程会通过一系列编程例子来让你对 Swift 有初步了解,如果你有什么不理解的地方也不用担心——任何本章介绍的内容都会在后面的章节中详细讲解。
|
||||||
|
|
||||||
> 注意:
|
> 注意:
|
||||||
> 在 Mac 上,下载 Playground 并双击文件在 Xcode 里打开:[https://developer.apple.com/go/?id=swift-tour](https://developer.apple.com/go/?id=swift-tour)
|
> 最佳实践是,在 Xcode 作为 playground 打开本章,Playgrounds允许你编辑你的代码并且立即得到结果,[下载 Playground](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/GuidedTour.playground.zip)
|
||||||
|
|
||||||
<a name="simple_values"></a>
|
<a name="simple_values"></a>
|
||||||
## 简单值
|
## 简单值
|
||||||
@ -143,10 +146,11 @@ if let name = optionalName {
|
|||||||
```
|
```
|
||||||
|
|
||||||
> 练习:
|
> 练习:
|
||||||
> 把`optionalName`改成`nil`,greeting会是什么?添加一个`else`语句,当`optionalName`是`nil`时给greeting赋一个不同的值。
|
> 把`optionalName`改成`nil`,greeting会是什么?添加一个`else`语句,当`optionalName`是`nil`时给 greeting 赋一个不同的值。
|
||||||
|
|
||||||
如果变量的可选值是`nil`,条件会判断为`false`,大括号中的代码会被跳过。如果不是`nil`,会将值赋给`let`后面的常量,这样代码块中就可以使用这个值了。
|
如果变量的可选值是`nil`,条件会判断为`false`,大括号中的代码会被跳过。如果不是`nil`,会将值赋给`let`后面的常量,这样代码块中就可以使用这个值了。
|
||||||
另一种处理可选值的方法是通过使用 ?? 操作符来提供一个默认值。如果可选值缺失的话,可以使用默认值来代替。
|
另一种处理可选值的方法是通过使用 `??` 操作符来提供一个默认值。如果可选值缺失的话,可以使用默认值来代替。
|
||||||
|
|
||||||
```swift
|
```swift
|
||||||
let nickName: String? = nil
|
let nickName: String? = nil
|
||||||
let fullName: String = "John Appleseed"
|
let fullName: String = "John Appleseed"
|
||||||
@ -242,6 +246,15 @@ greet("Bob", day: "Tuesday")
|
|||||||
> 练习:
|
> 练习:
|
||||||
> 删除`day`参数,添加一个参数来表示今天吃了什么午饭。
|
> 删除`day`参数,添加一个参数来表示今天吃了什么午饭。
|
||||||
|
|
||||||
|
默认情况下,函数使用它们的参数名称作为它们参数的标签,在参数名称前可以自定义参数标签,或者使用 `_` 表示不使用参数标签。
|
||||||
|
|
||||||
|
```
|
||||||
|
func greet(_ person: String, on day: String) -> String {
|
||||||
|
return "Hello \(person), today is \(day)."
|
||||||
|
}
|
||||||
|
greet("John", on: "Wednesday")
|
||||||
|
```
|
||||||
|
|
||||||
使用元组来让一个函数返回多个值。该元组的元素可以用名称或数字来表示。
|
使用元组来让一个函数返回多个值。该元组的元素可以用名称或数字来表示。
|
||||||
|
|
||||||
```swift
|
```swift
|
||||||
@ -277,7 +290,7 @@ func sumOf(numbers: Int...) -> Int {
|
|||||||
return sum
|
return sum
|
||||||
}
|
}
|
||||||
sumOf()
|
sumOf()
|
||||||
sumOf(42, 597, 12)
|
sumOf(numbers: 42, 597, 12)
|
||||||
```
|
```
|
||||||
|
|
||||||
> 练习:
|
> 练习:
|
||||||
@ -325,7 +338,7 @@ func lessThanTen(number: Int) -> Bool {
|
|||||||
return number < 10
|
return number < 10
|
||||||
}
|
}
|
||||||
var numbers = [20, 19, 7, 12]
|
var numbers = [20, 19, 7, 12]
|
||||||
hasAnyMatches(numbers, condition: lessThanTen)
|
hasAnyMatches(list: numbers, condition: lessThanTen)
|
||||||
```
|
```
|
||||||
|
|
||||||
函数实际上是一种特殊的闭包:它是一段能之后被调取的代码。闭包中的代码能访问闭包所建作用域中能得到的变量和函数,即使闭包是在一个不同的作用域被执行的 - 你已经在嵌套函数例子中所看到。你可以使用`{}`来创建一个匿名闭包。使用`in`将参数和返回值类型声明与闭包函数体进行分离。
|
函数实际上是一种特殊的闭包:它是一段能之后被调取的代码。闭包中的代码能访问闭包所建作用域中能得到的变量和函数,即使闭包是在一个不同的作用域被执行的 - 你已经在嵌套函数例子中所看到。你可以使用`{}`来创建一个匿名闭包。使用`in`将参数和返回值类型声明与闭包函数体进行分离。
|
||||||
@ -339,7 +352,7 @@ numbers.map({
|
|||||||
```
|
```
|
||||||
|
|
||||||
> 练习:
|
> 练习:
|
||||||
> 重写闭包,对所有奇数返回0。
|
> 重写闭包,对所有奇数返回 0。
|
||||||
|
|
||||||
有很多种创建更简洁的闭包的方法。如果一个闭包的类型已知,比如作为一个回调函数,你可以忽略参数的类型和返回值。单个语句闭包会把它语句的值当做结果返回。
|
有很多种创建更简洁的闭包的方法。如果一个闭包的类型已知,比如作为一个回调函数,你可以忽略参数的类型和返回值。单个语句闭包会把它语句的值当做结果返回。
|
||||||
|
|
||||||
@ -468,7 +481,7 @@ print(triangle.sideLength)
|
|||||||
|
|
||||||
1. 设置子类声明的属性值
|
1. 设置子类声明的属性值
|
||||||
2. 调用父类的构造器
|
2. 调用父类的构造器
|
||||||
3. 改变父类定义的属性值。其他的工作比如调用方法、getters和setters也可以在这个阶段完成。
|
3. 改变父类定义的属性值。其他的工作比如调用方法、getters 和 setters 也可以在这个阶段完成。
|
||||||
|
|
||||||
如果你不需要计算属性,但是仍然需要在设置一个新值之前或者之后运行代码,使用`willSet`和`didSet`。
|
如果你不需要计算属性,但是仍然需要在设置一个新值之前或者之后运行代码,使用`willSet`和`didSet`。
|
||||||
|
|
||||||
@ -689,10 +702,10 @@ print(protocolValue.simpleDescription)
|
|||||||
<a name="error_handling"></a>
|
<a name="error_handling"></a>
|
||||||
## 错误处理
|
## 错误处理
|
||||||
|
|
||||||
使用采用`ErrorType`协议的类型来表示错误。
|
使用采用`Error`协议的类型来表示错误。
|
||||||
|
|
||||||
```swift
|
```swift
|
||||||
enum PrinterError: ErrorType {
|
enum PrinterError: Error {
|
||||||
case OutOfPaper
|
case OutOfPaper
|
||||||
case NoToner
|
case NoToner
|
||||||
case OnFire
|
case OnFire
|
||||||
@ -755,13 +768,13 @@ let printerFailure = try? sendToPrinter("Never Has Toner")
|
|||||||
var fridgeIsOpen = false
|
var fridgeIsOpen = false
|
||||||
let fridgeContent = ["milk", "eggs", "leftovers"]
|
let fridgeContent = ["milk", "eggs", "leftovers"]
|
||||||
|
|
||||||
func fridgeContains(itemName: String) -> Bool {
|
func fridgeContains(_ food: String) -> Bool {
|
||||||
fridgeIsOpen = true
|
fridgeIsOpen = true
|
||||||
defer {
|
defer {
|
||||||
fridgeIsOpen = false
|
fridgeIsOpen = false
|
||||||
}
|
}
|
||||||
|
|
||||||
let result = fridgeContent.contains(itemName)
|
let result = fridgeContent.contains(food)
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
fridgeContains("banana")
|
fridgeContains("banana")
|
||||||
@ -774,20 +787,20 @@ print(fridgeIsOpen)
|
|||||||
在尖括号里写一个名字来创建一个泛型函数或者类型。
|
在尖括号里写一个名字来创建一个泛型函数或者类型。
|
||||||
|
|
||||||
```swift
|
```swift
|
||||||
func repeatItem<Item>(item: Item, numberOfTimes: Int) -> [Item] {
|
func repeatItem<Item>(repeating item: Item, numberOfTimes: Int) -> [Item] {
|
||||||
var result = [Item]()
|
var result = [Item]()
|
||||||
for _ in 0..<numberOfTimes {
|
for _ in 0..<numberOfTimes {
|
||||||
result.append(item)
|
result.append(item)
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
repeatItem("knock", numberOfTimes:4)
|
repeatItem(repeating: "knock", numberOfTimes:4)
|
||||||
```
|
```
|
||||||
|
|
||||||
你也可以创建泛型函数、方法、类、枚举和结构体。
|
你也可以创建泛型函数、方法、类、枚举和结构体。
|
||||||
|
|
||||||
```swift
|
```swift
|
||||||
// Reimplement the Swift standard library's optional type
|
// 重新实现 Swift 标准库中的可选类型
|
||||||
enum OptionalValue<Wrapped> {
|
enum OptionalValue<Wrapped> {
|
||||||
case None
|
case None
|
||||||
case Some(Wrapped)
|
case Some(Wrapped)
|
||||||
|
|||||||
@ -25,11 +25,14 @@
|
|||||||
>
|
>
|
||||||
> 2.2
|
> 2.2
|
||||||
> 翻译+校对:[changkun](http://changkun.us/about/)
|
> 翻译+校对:[changkun](http://changkun.us/about/)
|
||||||
|
>
|
||||||
|
> 3.0
|
||||||
|
> 翻译+校对:[shanks](http://codebuild.me),2016-10-06
|
||||||
|
|
||||||
本页面根据 [Document Revision History](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/RevisionHistory.html) 进行适配更新。
|
本页面根据 [Document Revision History](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/RevisionHistory.html) 进行适配更新。
|
||||||
|
|
||||||
本页内容包括:
|
本页内容包括:
|
||||||
|
- [Swift 3.0 更新](#swift_3_0)
|
||||||
- [Swift 2.2 更新](#swift_2_2)
|
- [Swift 2.2 更新](#swift_2_2)
|
||||||
- [Swift 2.1 更新](#swift_2_1)
|
- [Swift 2.1 更新](#swift_2_1)
|
||||||
- [Swift 2.0 更新](#swift_2_0)
|
- [Swift 2.0 更新](#swift_2_0)
|
||||||
@ -37,6 +40,10 @@
|
|||||||
- [Swift 1.1 更新](#swift_1_1)
|
- [Swift 1.1 更新](#swift_1_1)
|
||||||
- [Swift 1.0 更新](#swift_1_0)
|
- [Swift 1.0 更新](#swift_1_0)
|
||||||
|
|
||||||
|
|
||||||
|
<a name="swift_3_0"></a>
|
||||||
|
### Swift 3.0 更新
|
||||||
|
|
||||||
<a name="swift_2_2"></a>
|
<a name="swift_2_2"></a>
|
||||||
### Swift 2.2 更新
|
### Swift 2.2 更新
|
||||||
|
|
||||||
@ -48,6 +55,18 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td scope="row">2016-09-13</td>
|
||||||
|
<td><ul class="list-bullet">
|
||||||
|
<li>
|
||||||
|
更新至 Swift 3.0。
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
更新[函数]()章节中关于函数的讨论,在函数定义一节中,标明所有函数参数默认都有函数标签
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td scope="row">2016-03-21</td>
|
<td scope="row">2016-03-21</td>
|
||||||
<td><ul class="list-bullet">
|
<td><ul class="list-bullet">
|
||||||
|
|||||||
Reference in New Issue
Block a user