markdown 格式和标点符号的一些修正 (#780)
* 修正全角逗号、句号的使用 * 修正逗号使用 * 修正一处代码空格错误 * 修正斜体范围,引用的空格使用 * 修正示例代码错误 * 修正标点,修正示例代码 * 修正标点 * 修正标点 * 添加 Swift 3.1 的更新 * 修改 Swift 3.0.1 位置 * 添加 Swift 4.0.3 更新 * 添加 Swift 4.1 更新 * 修正示例代码 * 修正 markdown 引用语法,优化翻译语句 * 修正示例代码 * 修正标点使用,优化翻译语句 * 修正示例代码 * 修正示例代码 * 优化翻译语句,修正示例代码语法 * 更新示例代码以符合 Swift 4.1 * 优化 markdown 引用格式的使用 * 优化 markdown 行内代码块使用,代码块与正文使用空格分隔 * 人工校验 markdown 行内代码块使用 * 中英文空格分隔 * 移除行末空格 * 人工校验 markdown 行内代码块使用 * 修正 markdown 无序列表使用 * 统一 markdown 行间代码块的使用 * 人工修正顿号与句号的使用 * 人工修改双引号的使用 * 行内代码块使用“`代码块`”格式
This commit is contained in:
@ -64,6 +64,7 @@ Swift 语言存在两种类型:命名型类型和复合型类型。命名型
|
||||
let someTuple: (Double, Double) = (3.14159, 2.71828)
|
||||
func someFunction(a: Int) { /* ... */ }
|
||||
```
|
||||
|
||||
在第一个例子中,表达式 `someTuple` 的类型被指定为 `(Double, Double)`。在第二个例子中,函数 `someFunction` 的参数 `a` 的类型被指定为 `Int`。
|
||||
|
||||
类型注解可以在类型之前包含一个类型特性的可选列表。
|
||||
@ -166,7 +167,7 @@ f = functionWithDifferentNumberOfArguments // 错误
|
||||
|
||||
由于变量标签不是函数类型的一部分,你可以在写函数类型的时候省略它们。
|
||||
|
||||
```
|
||||
```swift
|
||||
var operation: (lhs: Int, rhs: Int) -> Int // 错误
|
||||
var operation: (_ lhs: Int, _ rhs: Int) -> Int // 正确
|
||||
var operation: (Int, Int) -> Int // 正确
|
||||
@ -180,7 +181,7 @@ var operation: (Int, Int) -> Int // 正确
|
||||
### 对非逃逸闭包的限制
|
||||
非逃逸闭包函数不能作为参数传递到另一个非逃逸闭包函数的参数。这样的限制可以让 Swift 在编译时就完成更多的内存访问冲突检查, 而不是在运行时。举个例子:
|
||||
|
||||
```
|
||||
```swift
|
||||
let external: (Any) -> Void = { _ in () }
|
||||
func takesTwoFunctions(first: (Any) -> Void, second: (Any) -> Void) {
|
||||
first(first) // 错误
|
||||
@ -193,6 +194,7 @@ func takesTwoFunctions(first: (Any) -> Void, second: (Any) -> Void) {
|
||||
external(first) // 正确
|
||||
}
|
||||
```
|
||||
|
||||
在上面代码里,`takesTwoFunctions(first:second:)` 的两个参数都是函数。 它们都没有标记为 `@escaping`, 因此它们都是非逃逸的。
|
||||
|
||||
上述例子里的被标记为“错误”的四个函数调用会产生编译错误。因为第一个和第二个参数是非逃逸函数,它们不能够被当作变量被传递到另一个非闭包函数参数。与此相反, 标记“正确”的两个函数不回产生编译错误。这些函数调用不会违反限制, 因为 `外部(external)` 不是 `takesTwoFunctions(first:second:)` 里的一个参数。
|
||||
|
||||
@ -587,6 +587,7 @@ class SomeClass: NSObject {
|
||||
let selectorForMethod = #selector(SomeClass.doSomething(_:))
|
||||
let selectorForPropertyGetter = #selector(getter: SomeClass.property)
|
||||
```
|
||||
|
||||
当为属性的 getter 创建选择器时,属性名可以是变量属性或者常量属性的引用。但是当为属性的 setter 创建选择器时,属性名只可以是对变量属性的引用。
|
||||
|
||||
方法名称可以包含圆括号来进行分组,并使用 as 操作符来区分具有相同方法名但类型不同的方法,例如:
|
||||
|
||||
@ -102,6 +102,7 @@ Swift 的源文件中的顶级代码 (top-level code) 由零个或多个语句
|
||||
语句
|
||||
}
|
||||
```
|
||||
|
||||
代码块中的“语句”包括声明、表达式和各种其他类型的语句,它们按照在源码中的出现顺序被依次执行。
|
||||
|
||||
> 代码块语法
|
||||
@ -332,6 +333,7 @@ typealias 类型别名 = 现存类型
|
||||
|
||||
当声明一个类型的别名后,可以在程序的任何地方使用“别名”来代替现有类型。现有类型可以是具有命名的类型或者混合类型。类型别名不产生新的类型,它只是使用别名来引用现有类型。
|
||||
类型别名声明可以通过泛型参数来给一个现有泛型类型提供名称。类型别名为现有类型的一部分或者全部泛型参数提供具体类型。例如:
|
||||
|
||||
```swift
|
||||
typealias StringDictionary<Value> = Dictionary<String, Value>
|
||||
|
||||
@ -339,12 +341,16 @@ typealias StringDictionary<Value> = Dictionary<String, Value>
|
||||
var dictionary1: StringDictionary<Int> = [:]
|
||||
var dictionary2: Dictionary<String, Int> = [:]
|
||||
```
|
||||
|
||||
当一个类型别名带着泛型参数一起被声明时,这些参数的约束必须与现有参数的约束完全匹配。例如:
|
||||
|
||||
```swift
|
||||
typealias DictionaryOfInts<Key: Hashable> = Dictionary<Key, Int>
|
||||
```
|
||||
|
||||
因为类型别名可以和现有类型相互交换使用,类型别名不可以引入额外的类型约束。
|
||||
在协议声明中,类型别名可以为那些经常使用的类型提供一个更短更方便的名称,例如:
|
||||
|
||||
```swift
|
||||
protocol Sequence {
|
||||
associatedtype Iterator: IteratorProtocol
|
||||
@ -355,6 +361,7 @@ func sum<T: Sequence>(_ sequence: T) -> Int where T.Element == Int {
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
假如没有类型别名,sum 函数将必须引用关联类型通过 T.Iterator.Element 的形式来替代 T.Element。
|
||||
|
||||
另请参阅 [协议关联类型声明](#protocol_associated_type_declaration)。
|
||||
@ -1096,6 +1103,7 @@ extension 类型名称 where 要求 {
|
||||
声明语句
|
||||
}
|
||||
```
|
||||
|
||||
扩展声明体可包含零个或多个声明语句。这些声明语句可以包括计算型属性、计算型类型属性、实例方法、类型方法、构造器、下标声明,甚至是类、结构体和枚举声明。扩展声明不能包含析构器、协议声明、存储型属性、属性观察器或其他扩展声明。关于扩展声明的详细讨论,以及各种扩展声明的例子,请参阅 [扩展](../chapter2/21_Extensions.md)。
|
||||
|
||||
如果类型为类,结构体,或枚举类型,则扩展声明会扩展相应的类型。如果类型为协议类型,则扩展声明会扩展所有遵守这个协议的类型。在扩展的协议体中声明语句不能使用 `final` 标识符。
|
||||
|
||||
@ -141,6 +141,7 @@ var enabled: Bool {
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
`nonobjc`
|
||||
|
||||
该特性用于方法、属性、下标、或构造器的声明,这些声明本可以在 Objective-C 代码中使用,而使用 `nonobjc` 特性则告诉编译器这个声明不能在 Objective-C 代码中使用。
|
||||
@ -159,6 +160,7 @@ var enabled: Bool {
|
||||
import AppKit
|
||||
NSApplicationMain(CommandLine.argc, CommandLine.unsafeArgv)
|
||||
```
|
||||
|
||||
`NSCopying`
|
||||
|
||||
该特性用于修饰一个类的存储型变量属性。该特性将使属性的设值方法使用传入值的副本进行赋值,这个值由传入值的 `copyWithZone`(\_:) 方法返回。该属性的类型必需符合 `NSCopying` 协议。
|
||||
|
||||
Reference in New Issue
Block a user