From 08e7cf1e6364ff3f441118781b51af4b554b9302 Mon Sep 17 00:00:00 2001 From: Sunset Wan Date: Sun, 16 Feb 2020 13:02:01 +0800 Subject: [PATCH] =?UTF-8?q?Swift=205.2=20=E6=96=B0=E5=A2=9E=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E7=9A=84=E9=83=A8=E5=88=86=E7=BF=BB=E8=AF=91=20(#1036?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add translations of swift 5.2. * Add translations of swift 5.2. * Add translations of swift 5.2. * Add translations of swift 5.2. * Update 04_Expressions.md * Refine translations * Refine translations * Update 07_Attributes.md Co-authored-by: Jie Liang --- source/02_language_guide/12_Subscripts.md | 4 +++- source/03_language_reference/03_Types.md | 9 ++++++++- source/03_language_reference/04_Expressions.md | 4 +++- source/03_language_reference/07_Attributes.md | 6 +++++- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/source/02_language_guide/12_Subscripts.md b/source/02_language_guide/12_Subscripts.md index 51d8ffe2..fbf70903 100755 --- a/source/02_language_guide/12_Subscripts.md +++ b/source/02_language_guide/12_Subscripts.md @@ -72,7 +72,9 @@ numberOfLegs["bird"] = 2 ## 下标选项 {#subscript-options} -下标可以接受任意数量的入参,并且这些入参可以是任意类型。下标的返回值也可以是任意类型。下标可以使用可变参数,但是不能使用 in-out 参数以及不能提供默认参数。 +下标可以接受任意数量的入参,并且这些入参可以是任何类型。下标的返回值也可以是任意类型。 + +与函数一样,下标可以接受不同数量的参数,并且为这些参数提供默认值,如在[可变参数](./06_Functions.md#variadic-parameters) 和 [默认参数值](./06_Functions.md#default-parameter-values) 中所述。但是,与函数不同的是,下标不能使用 in-out 参数。 一个类或结构体可以根据自身需要提供多个下标实现,使用下标时将通过入参的数量和类型进行区分,自动匹配合适的下标。它通常被称为*下标的重载*。 diff --git a/source/03_language_reference/03_Types.md b/source/03_language_reference/03_Types.md index aad9e43e..5fcf61b4 100644 --- a/source/03_language_reference/03_Types.md +++ b/source/03_language_reference/03_Types.md @@ -450,7 +450,14 @@ let anotherInstance = metatype.init(string: "some string") 在协议声明或者协议成员声明时,`Self` 类型引用的是最终遵循该协议的类型。 -在结构体,类或者枚举值声明时,`Self` 类型引用的是声明的类型。在某个类型成员声明时,`Self` 类型引用的是该类型。在类成员声明时,`Self` 可以在方法的返回值和方法体中使用,但不能在其他上下文中使用。举个例子,下面的代码演示了返回值是 `Self` 的实例方法 `f` 。 +在结构体,类或者枚举值声明时,Self 类型引用的是声明的类型。在某个类型成员声明时,Self 类型引用的是该类型。在类成员声明时,`Self` 只能在以下几种情况中出现: + +* 作为方法的返回类型 +* 作为只读下标的返回类型 +* 作为只读计算属性的类型 +* 在方法体中 + +举个例子,下面的代码演示了返回值是 `Self` 的实例方法 `f` 。 ```swift class Superclass { diff --git a/source/03_language_reference/04_Expressions.md b/source/03_language_reference/04_Expressions.md index a6837435..43a980d5 100644 --- a/source/03_language_reference/04_Expressions.md +++ b/source/03_language_reference/04_Expressions.md @@ -677,7 +677,7 @@ let value = s[keyPath: pathToProperty] ```swift class SomeClass: NSObject { - @objc var someProperty: Int + @objc dynamic var someProperty: Int init(someProperty: Int) { self.someProperty = someProperty } @@ -977,6 +977,8 @@ myData.someMethod() {$0 == 13} myData.someMethod {$0 == 13} ``` +如 [特殊名称方法](./06_Declarations.md#methods-with-special-names) 所述,通过声明几种方法中的一种,类、结构体或枚举类型可以为函数调用语法启用语法糖。 + > 函数调用表达式语法 > > diff --git a/source/03_language_reference/07_Attributes.md b/source/03_language_reference/07_Attributes.md index d6918b1d..507187b5 100755 --- a/source/03_language_reference/07_Attributes.md +++ b/source/03_language_reference/07_Attributes.md @@ -235,7 +235,7 @@ print(wrapper.x) 针对枚举或者结构体的声明使用该特性,可以限制你对该类型的修改。它只有在编译迭代库时被允许使用。未来版本的库不能通过添加、删除或重新排序枚举的 case 或结构的存储实例属性来更改声明。在未冻结的类型上,这些操作都是允许的,但是他们破坏了冻结类型的 ABI 兼容性。 > 注意 -> 当编译器不处于迭代库的模式,所有的结构体和枚举都是隐性冻结,并且你不能使用该特性。 +> 当编译器不处于迭代库的模式,所有的结构体和枚举都是隐性冻结,并且该特性会被忽视。 在迭代库的模式中,与未冻结结构体和枚举的成员进行交互的代码在被编译时,允许它在不重新编译的情况下继续工作,即使在新版本的库中添加、删除或重新排序该类型的成员。编译器用类似运行时查找信息和添加间接层的技术使之可能。将一个枚举或者结构体标记为冻结将以放弃这种灵活性为代价来获取性能上的提升:未来版本的库只能对类型进行有限的更改,但编译器可以对与类型成员交互的代码进行额外的优化。 @@ -315,6 +315,10 @@ class ExampleClass: NSObject { } } ``` +更多相关信息,请参考 [把 Swift 导入 Objective-C](https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_swift_into_objective-c)。 + +> 注意 +> 具有 `objc` 特性的实参也会改变那个声明的运行时名称。在调用与 Objective-C 运行时交互的函数时,比如 [NSClassFromString](https://developer.apple.com/documentation/foundation/1395135-nsclassfromstring),以及在应用程序的 info.plist 文件中指定类名时,你会用到运行时名称。如果你通过传递实参的方式来指定名称,这个名称会作为 Objective-C 代码中的名称和运行时名称。如果你不使用这个实参,在 Objective-C 代码中使用的名称会与 Swift 代码中的名称匹配,并且运行时名称会遵循标准 Swift 编译器名称管理的惯例。 ### `objcMembers` {#objcmembers}