2.1校对
2.1校对
This commit is contained in:
@ -1,6 +1,6 @@
|
|||||||
# 表达式(Expressions)
|
# 表达式(Expressions)
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
> 1.0
|
> 1.0
|
||||||
> 翻译:[sg552](https://github.com/sg552)
|
> 翻译:[sg552](https://github.com/sg552)
|
||||||
> 校对:[numbbbbb](https://github.com/numbbbbb), [stanzhai](https://github.com/stanzhai)
|
> 校对:[numbbbbb](https://github.com/numbbbbb), [stanzhai](https://github.com/stanzhai)
|
||||||
@ -31,9 +31,11 @@ Swift 中存在四种表达式: 前缀(prefix)表达式,二元(binary
|
|||||||
|
|
||||||
前缀表达式由可选的前缀符号和表达式组成。(这个前缀符号只能接收一个参数)
|
前缀表达式由可选的前缀符号和表达式组成。(这个前缀符号只能接收一个参数)
|
||||||
|
|
||||||
对于这些操作符的使用,请参见: Basic Operators and Advanced Operators
|
对于这些操作符的使用,请参见: [Basic Operators](TODO:添加链接) 和 [Advanced Operators](TODO:添加链接)
|
||||||
|
|
||||||
作为对上面标准库运算符的补充,你也可以对 某个函数的参数使用 '&'运算符。 更多信息,请参见: "In-Out parameters".
|
对于 Swift 标准库提供的操作符的使用,请参见[Swift Standard Library Operators Reference](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Reference/Swift_StandardLibrary_Operators/index.html#//apple_ref/doc/uid/TP40016054)。
|
||||||
|
|
||||||
|
作为对上面标准库运算符的补充,你也可以对 某个函数的参数使用 '&'运算符。 更多信息,请参见: [In-Out parameters](TODO:添加链接).
|
||||||
|
|
||||||
> 前置表达式语法
|
> 前置表达式语法
|
||||||
> *前置表达式* → [*前置运算符*](LexicalStructure.html#prefix_operator) _可选_ [*后置表达式*](../chapter3/04_Expressions.html#postfix_expression)
|
> *前置表达式* → [*前置运算符*](LexicalStructure.html#prefix_operator) _可选_ [*后置表达式*](../chapter3/04_Expressions.html#postfix_expression)
|
||||||
@ -46,9 +48,21 @@ try表达式由紧跟在可能会出错的表达式后面的`try`操作符组成
|
|||||||
`try expression`
|
`try expression`
|
||||||
强制的try表示由紧跟在可能会出错的表达式后面的`try!`操作符组成,出错时会产生一个运行时错误,形式如下:
|
强制的try表示由紧跟在可能会出错的表达式后面的`try!`操作符组成,出错时会产生一个运行时错误,形式如下:
|
||||||
`try! expression`
|
`try! expression`
|
||||||
关于`try`更多的例子和信息请参见:Catching and Handling Errors.
|
|
||||||
|
当在二进制运算符左边的表达式被标记上 `try`、`try?` 或者 `try!` 时,这个操作对整个二进制表达式都产生作用。也就是说,你可以使用圆括号来明确操作符的应用范围。
|
||||||
|
|
||||||
|
```
|
||||||
|
sum = try someThrowingFunction() + anotherThrowingFunction() // try 对两个方法调用都产生作用
|
||||||
|
sum = try (someThrowingFunction() + anotherThrowingFunction()) // try 对两个方法调用都产生作用
|
||||||
|
sum = (try someThrowingFunction()) + anotherThrowingFunction() // Error: try 只对第一个方法调用产生作用
|
||||||
|
```
|
||||||
|
|
||||||
|
`try` 表达式不能出现在二进制操作符的的右边,除非二进制操作符是赋值操作符或者 `try` 表达式是被圆括号括起来的。
|
||||||
|
|
||||||
|
关于`try`、`try?` 和 `try!` 更多的例子和信息请参见:[Error Handling](TODO:添加链接)
|
||||||
|
|
||||||
> try表达式语法
|
> try表达式语法
|
||||||
> *try 操作符* → [*try*](LexicalStructure.html#try_operator) | *try!*
|
> *try 操作符* → [*try*](LexicalStructure.html#try_operator) | try? | *try!*
|
||||||
|
|
||||||
<a name="binary_expressions"></a>
|
<a name="binary_expressions"></a>
|
||||||
## 二元表达式(Binary Expressions)
|
## 二元表达式(Binary Expressions)
|
||||||
@ -57,7 +71,7 @@ try表达式由紧跟在可能会出错的表达式后面的`try`操作符组成
|
|||||||
|
|
||||||
> `left-hand argument` `operator` `right-hand argument`
|
> `left-hand argument` `operator` `right-hand argument`
|
||||||
|
|
||||||
关于这些运算符(operators)的更多信息,请参见:Basic Operators and Advanced Operators.
|
关于这些运算符(operators)的更多信息,请参见:[Basic Operators](TODO:添加链接)和 [Advanced Operators](TODO:添加链接)。
|
||||||
|
|
||||||
> 注意
|
> 注意
|
||||||
> 在解析时, 一个二元表达式表示为一个一级数组(a flat list), 这个数组(List)根据运算符的先后顺序,被转换成了一个tree. 例如: 2 + 3 * 5 首先被认为是: 2, + , `` 3``, *, 5. 随后它被转换成 tree (2 + (3 * 5))
|
> 在解析时, 一个二元表达式表示为一个一级数组(a flat list), 这个数组(List)根据运算符的先后顺序,被转换成了一个tree. 例如: 2 + 3 * 5 首先被认为是: 2, + , `` 3``, *, 5. 随后它被转换成 tree (2 + (3 * 5))
|
||||||
@ -137,7 +151,7 @@ f(x as Any)
|
|||||||
|
|
||||||
`a!`操作符表示强制转换,其返回指定的类型,而不是可选的类型。如果转换失败,则会出现运行时错误。表达式`x as T` 效果等同于`(x as? T)!`。
|
`a!`操作符表示强制转换,其返回指定的类型,而不是可选的类型。如果转换失败,则会出现运行时错误。表达式`x as T` 效果等同于`(x as? T)!`。
|
||||||
|
|
||||||
关于类型转换的更多内容和例子,请参见: Type Casting.
|
关于类型转换的更多内容和例子,请参见: [Type Casting](TODO:添加链接).
|
||||||
|
|
||||||
> 类型转换运算符(type-casting-operator)语法
|
> 类型转换运算符(type-casting-operator)语法
|
||||||
> *类型转换运算符* → **is** [*类型*](../chapter3/03_Types.html#type)
|
> *类型转换运算符* → **is** [*类型*](../chapter3/03_Types.html#type)
|
||||||
@ -283,7 +297,7 @@ struct Point {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
闭包的参数声明形式跟方法中的声明一样, 请参见:Function Declaration.
|
闭包的参数声明形式跟方法中的声明一样, 请参见:[Function Declaration](TODO:添加链接).
|
||||||
|
|
||||||
闭包还有几种特殊的形式, 让使用更加简洁:
|
闭包还有几种特殊的形式, 让使用更加简洁:
|
||||||
|
|
||||||
@ -309,9 +323,11 @@ myFunction { return $0 + $1 }
|
|||||||
myFunction { $0 + $1 }
|
myFunction { $0 + $1 }
|
||||||
```
|
```
|
||||||
|
|
||||||
关于 向闭包中传递参数的内容,参见: Function Call Expression.
|
关于 向闭包中传递参数的内容,参见: [Function Call Expression](TODO:添加链接).
|
||||||
|
|
||||||
闭包表达式可以通过一个参数列表(capture list) 来显式指定它需要的参数。 参数列表 由中括号 [] 括起来,里面的参数由逗号','分隔。一旦使用了参数列表,就必须使用'in'关键字(在任何情况下都得这样做,包括忽略参数的名字,type, 返回值时等等)。
|
### 参数列表(Capture Lists)
|
||||||
|
|
||||||
|
闭包表达式可以通过一个参数列表(capture list) 来显式指定它需要的参数。 参数列表由中括号 [] 括起来,里面的参数由逗号','分隔。一旦使用了参数列表,就必须使用'in'关键字(在任何情况下都得这样做,包括忽略参数的名字,type, 返回值时等等)。
|
||||||
|
|
||||||
在闭包的参数列表( capture list)中, 参数可以声明为 'weak' 或者 'unowned' .
|
在闭包的参数列表( capture list)中, 参数可以声明为 'weak' 或者 'unowned' .
|
||||||
|
|
||||||
@ -328,7 +344,7 @@ myFunction { [unowned self] in print(self.title) } // unowned capture
|
|||||||
myFunction { [weak parent = self.parent] in print(parent!.title) }
|
myFunction { [weak parent = self.parent] in print(parent!.title) }
|
||||||
```
|
```
|
||||||
|
|
||||||
关于闭包表达式的更多信息和例子,请参见: Closure Expressions.
|
关于闭包表达式的更多信息和例子,请参见: [Closure Expressions](TODO:添加链接),关于更多参数列表的信息和例子,请参见: [Resolving Strong Reference Cycles for Closures](TODO:添加链接)。
|
||||||
|
|
||||||
> 闭包表达式语法
|
> 闭包表达式语法
|
||||||
> *闭包表达式* → **{** [*闭包签名(Signational)*](../chapter3/04_Expressions.html#closure_signature) _可选_ [*多条语句(Statements)*](../chapter3/10_Statements.html#statements) **}**
|
> *闭包表达式* → **{** [*闭包签名(Signational)*](../chapter3/04_Expressions.html#closure_signature) _可选_ [*多条语句(Statements)*](../chapter3/10_Statements.html#statements) **}**
|
||||||
@ -440,8 +456,8 @@ myData.someMethod {$0 == 13}
|
|||||||
|
|
||||||
Initializer表达式用来给某个Type初始化。 它的形式如下:
|
Initializer表达式用来给某个Type初始化。 它的形式如下:
|
||||||
|
|
||||||
> `expression`.init(`initializer arguments`)
|
> `expression`.init(`initializer arguments`)
|
||||||
|
|
||||||
初始化函数表达式在调用函数时用来初始某个Type。 也可以使用初始化函数表达式来委托调用(delegate to )到superclass的initializers.
|
初始化函数表达式在调用函数时用来初始某个Type。 也可以使用初始化函数表达式来委托调用(delegate to )到superclass的initializers.
|
||||||
|
|
||||||
|
|
||||||
@ -453,29 +469,29 @@ class SomeSubClass: SomeSuperClass {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
和函数类似, 初始化表达式可以用作数值。 举例来说:
|
和函数类似, 初始化表达式可以用作数值。 举例来说:
|
||||||
|
|
||||||
```swift
|
```swift
|
||||||
// Type annotation is required because String has multiple initializers.
|
// Type annotation is required because String has multiple initializers.
|
||||||
let initializer: Int -> String = String.init
|
let initializer: Int -> String = String.init
|
||||||
let oneTwoThree = [1, 2, 3].map(initializer).reduce("", combine: +)
|
let oneTwoThree = [1, 2, 3].map(initializer).reduce("", combine: +)
|
||||||
print(oneTwoThree)
|
print(oneTwoThree)
|
||||||
// prints "123"
|
// prints "123"
|
||||||
```
|
```
|
||||||
|
|
||||||
如果要用名字来指定某个type, 可以不用初始化函数表达式直接使用type的initializer。在其他情况下, 你必须使用初始化函数表达式。
|
如果要用名字来指定某个type, 可以不用初始化函数表达式直接使用type的initializer。在其他情况下, 你必须使用初始化函数表达式。
|
||||||
|
|
||||||
|
|
||||||
```swift
|
```swift
|
||||||
let s1 = SomeType.init(data: 3) // Valid
|
let s1 = SomeType.init(data: 3) // Valid
|
||||||
let s2 = SomeType(data: 1) // Also valid
|
let s2 = SomeType(data: 1) // Also valid
|
||||||
|
|
||||||
let s4 = someValue.dynamicType(data: 5) // Error
|
let s4 = someValue.dynamicType(data: 5) // Error
|
||||||
let s3 = someValue.dynamicType.init(data: 7) // Valid
|
let s3 = someValue.dynamicType.init(data: 7) // Valid
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
> 构造器表达式语法
|
> 构造器表达式语法
|
||||||
> *构造器表达式* → [*后置表达式*](../chapter3/04_Expressions.html#postfix_expression) **.** **init**
|
> *构造器表达式* → [*后置表达式*](../chapter3/04_Expressions.html#postfix_expression) **.** **init**
|
||||||
|
|||||||
Reference in New Issue
Block a user