diff --git a/source/chapter3/04_Expressions.md b/source/chapter3/04_Expressions.md index 27b0b8fa..801fde0c 100644 --- a/source/chapter3/04_Expressions.md +++ b/source/chapter3/04_Expressions.md @@ -1,6 +1,6 @@ # 表达式(Expressions) ------------------ - +----------------- + > 1.0 > 翻译:[sg552](https://github.com/sg552) > 校对:[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) @@ -46,9 +48,21 @@ try表达式由紧跟在可能会出错的表达式后面的`try`操作符组成 `try expression` 强制的try表示由紧跟在可能会出错的表达式后面的`try!`操作符组成,出错时会产生一个运行时错误,形式如下: `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*](LexicalStructure.html#try_operator) | *try!* +> *try 操作符* → [*try*](LexicalStructure.html#try_operator) | try­? | *try!* ## 二元表达式(Binary Expressions) @@ -57,7 +71,7 @@ try表达式由紧跟在可能会出错的表达式后面的`try`操作符组成 > `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)) @@ -137,7 +151,7 @@ f(x as Any) `a!`操作符表示强制转换,其返回指定的类型,而不是可选的类型。如果转换失败,则会出现运行时错误。表达式`x as T` 效果等同于`(x as? T)!`。 -关于类型转换的更多内容和例子,请参见: Type Casting. +关于类型转换的更多内容和例子,请参见: [Type Casting](TODO:添加链接). > 类型转换运算符(type-casting-operator)语法 > *类型转换运算符* → **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 } ``` -关于 向闭包中传递参数的内容,参见: Function Call Expression. +关于 向闭包中传递参数的内容,参见: [Function Call Expression](TODO:添加链接). -闭包表达式可以通过一个参数列表(capture list) 来显式指定它需要的参数。 参数列表 由中括号 [] 括起来,里面的参数由逗号','分隔。一旦使用了参数列表,就必须使用'in'关键字(在任何情况下都得这样做,包括忽略参数的名字,type, 返回值时等等)。 +### 参数列表(Capture Lists) + +闭包表达式可以通过一个参数列表(capture list) 来显式指定它需要的参数。 参数列表由中括号 [] 括起来,里面的参数由逗号','分隔。一旦使用了参数列表,就必须使用'in'关键字(在任何情况下都得这样做,包括忽略参数的名字,type, 返回值时等等)。 在闭包的参数列表( 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) } ``` -关于闭包表达式的更多信息和例子,请参见: 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) **}** @@ -440,8 +456,8 @@ myData.someMethod {$0 == 13} Initializer表达式用来给某个Type初始化。 它的形式如下: -> `expression`.init(`initializer arguments`) - +> `expression`.init(`initializer arguments`) + 初始化函数表达式在调用函数时用来初始某个Type。 也可以使用初始化函数表达式来委托调用(delegate to )到superclass的initializers. @@ -453,29 +469,29 @@ class SomeSubClass: SomeSuperClass { } } ``` - -和函数类似, 初始化表达式可以用作数值。 举例来说: - + +和函数类似, 初始化表达式可以用作数值。 举例来说: + ```swift // Type annotation is required because String has multiple initializers. -let initializer: Int -> String = String.init -let oneTwoThree = [1, 2, 3].map(initializer).reduce("", combine: +) -print(oneTwoThree) +let initializer: Int -> String = String.init +let oneTwoThree = [1, 2, 3].map(initializer).reduce("", combine: +) +print(oneTwoThree) // prints "123" -``` - -如果要用名字来指定某个type, 可以不用初始化函数表达式直接使用type的initializer。在其他情况下, 你必须使用初始化函数表达式。 - - +``` + +如果要用名字来指定某个type, 可以不用初始化函数表达式直接使用type的initializer。在其他情况下, 你必须使用初始化函数表达式。 + + ```swift let s1 = SomeType.init(data: 3) // Valid -let s2 = SomeType(data: 1) // Also valid - -let s4 = someValue.dynamicType(data: 5) // Error +let s2 = SomeType(data: 1) // Also valid + +let s4 = someValue.dynamicType(data: 5) // Error let s3 = someValue.dynamicType.init(data: 7) // Valid -``` - - +``` + + > 构造器表达式语法 > *构造器表达式* → [*后置表达式*](../chapter3/04_Expressions.html#postfix_expression) **.** **init**