From 826ac435afb0d891b342982fd802ccc9e7e95e0b Mon Sep 17 00:00:00 2001 From: stevenlordiam Date: Fri, 7 Aug 2015 17:21:39 -0400 Subject: [PATCH] update 04_Expressions.md as Apple updated the document in Apr 6th --- source/chapter3/04_Expressions.md | 35 +++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/source/chapter3/04_Expressions.md b/source/chapter3/04_Expressions.md index 7ef45764..762c0f77 100644 --- a/source/chapter3/04_Expressions.md +++ b/source/chapter3/04_Expressions.md @@ -440,16 +440,10 @@ myData.someMethod {$0 == 13} Initializer表达式用来给某个Type初始化。 它的形式如下: -> `expression`.init(`initializer arguments`) +> `expression`.init(`initializer arguments`) + +初始化函数表达式在调用函数时用来初始某个Type。 也可以使用初始化函数表达式来委托调用(delegate to )到superclass的initializers. -(Initializer表达式用来给某个Type初始化。) 跟函数(function)不同, initializer 不能返回值。 - -```swift -var x = SomeClass.someClassFunction // ok -var y = SomeClass.init // error -``` - -可以通过 initializer 表达式来委托调用(delegate to )到superclass的initializers. ```swift class SomeSubClass: SomeSuperClass { @@ -459,6 +453,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) +// prints "123" +``` + +如果要用名字来指定某个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 s3 = someValue.dynamicType.init(data: 7) // Valid +``` + + > 构造器表达式语法 > *构造器表达式* → [*后置表达式*](../chapter3/04_Expressions.html#postfix_expression) **.** **init**