From 220c05cb407b6f773b1d690606c8e88b364c68e5 Mon Sep 17 00:00:00 2001 From: oldcodeoberyn Date: Fri, 5 Sep 2014 22:13:03 +0800 Subject: [PATCH] Update from Obryen fix some typos add declaration modifiers add avaiability attribute --- source/chapter1/03_revision_history.md | 2 +- source/chapter3/05_Declarations.md | 68 ++++++++++++++++++++++++++ source/chapter3/06_Attributes.md | 45 ++++++----------- 3 files changed, 83 insertions(+), 32 deletions(-) diff --git a/source/chapter1/03_revision_history.md b/source/chapter1/03_revision_history.md index 52013eac..9371b665 100644 --- a/source/chapter1/03_revision_history.md +++ b/source/chapter1/03_revision_history.md @@ -44,7 +44,7 @@ 更新了连接字符串和字符(Concatenating Strings and Characters)小节来说明一个事实,那就是字符串和字符不能再用+号运算符或者复合加法运算符+=相互连接,这两种运算符现在只能用于字符串之间相连。请使用String类型的append方法在一个字符串的尾部增加单个字符

  • - 在属性声明(Declaration Attributes)章节增加了关于availability属性的一些信息

    + 在声明特性(Declaration Attributes)章节增加了关于availability特性的一些信息

  • diff --git a/source/chapter3/05_Declarations.md b/source/chapter3/05_Declarations.md index 66fc4fcf..1ebeedf9 100755 --- a/source/chapter3/05_Declarations.md +++ b/source/chapter3/05_Declarations.md @@ -22,6 +22,7 @@ - [扩展声明](#extension_declaration) - [下标脚本声明](#subscript_declaration) - [运算符声明](#operator_declaration) +- [声明修饰符](#declaration_modifiers) 一条声明可以在你的程序里引入新的名字和构造。举例来说,你可以使用声明来引入函数和方法,变量和常量,或者来定义 新的命名好的枚举,结构,类和协议类型。你也可以使用一条声明来延长一个已经存在的命名好的类型的行为。或者在你的 @@ -853,3 +854,70 @@ _中缀_运算符是二元运算符,它可以被置于两个操作数之间, > *优先级水平* → 数值 0 到 255 > *结和性子句* → **associativity** [*结和性*](..\chapter3\05_Declarations.html#associativity) > *结和性* → **left** | **right** | **none** + + + +## 声明修饰符 + + +声明修饰符是关键字或者说是上下文相关的关键字,它可以修改一个声明的行为或者含义。你可以在一个声明的特性和引进该声明的关键字之间,指定一个声明修饰符,并写下它的关键字或上下文相关的关键字。 + +`dynamic` +可以将该修饰符用于任何可以出现在Objective-C中的类成员上。当你将`dynamic`修饰符用于一个成员声明上时,对该成员的访问总是由Objective-C的实时系统动态地安排,而永远不会由编译器内联或去虚拟化。 +因为当一个声明被标识`dynamic`修饰符时,会由Objective-C的实时系统动态地安排,所以他们是被隐式的标识了`objc`特性的。 + +`final` + +该修饰符用于修饰一个类或类中的属性,方法,以及下标成员。如果用它修饰一个类,那么这个类则不能被继承。如果用它修饰类中的属性,方法或下标,则表示在子类中,它们不能被重写。 + +`lazy` + +该修饰符用于修饰类或结构体中的存储型变量属性,表示该属性的初始值最多只被计算和存储一次,且发生在第一次访问它时。如何使用`lazy`特性的一个例子,请见:[惰性存储型属性]()。 + +`optional` + +该修饰符用于修饰一个类或类中的属性,方法,以及下标成员,表示遵循类型没有被要求实现这些成员。 +你只能将`optional`修饰符用于被`objc`标识的协议。这样一来,只有类类型可以适配或遵循拥有可选成员需求的协议。关于如何使用`optional`修饰符,以及如何访问可选协议成员的指导(比如,你不确定遵循类型是否已经实现了这些可选成员),你可以参见可选成员需求一章 + +`required` + +该修饰符用于修饰一个类的特定构造器或便捷构造器,表示该类所有的子类都需要实现该构造器。在子类实现该构造器时,同样必须使用`required`修饰符修饰该构造器。 + + +`weak` + +`weak`修饰符用于修饰一个变量或一个存储型变量属性,表示该变量或属性通过一个弱引用指向存储其值的对象。该变量或属性的类型必须是一个可选类类型。通过`weak`修饰符可避免强引用循环。关于`weak`修饰符的例子和更多信息,你可以参见弱引用一章 + +### 权限控制的级别 + + +Swift提供了三个级别的权限控制:`public`, `internal`, 和 `private`。你可以给声明标识以下访问级别修饰符中的一个以指定声明的权限级别。权限控制在权限控制一章有详细说明。 + +`public` + +修饰符用于修饰声明时,表示该声明可被同一个模块中的代码访问。被`public`权限级别修饰符修饰的声明,还可被其他模块的代码访问,只要该模块注入了该声明所在的模块。 + +`internal` + +修饰符用于修饰声明时,表示该声明只能被同一模块中的代码访问。默认的,绝大多数声明会被隐式的标识上`internal`权限级别修饰符 + + +`private` + +修饰符用于修饰声明时,表示该声明只能被同一源文件中的代码访问。 + + +以上的任意一个权限级别修饰符都可以有选择的带上一个参数,该参数由关键字`set`和一对括号组成(比如,`private(set)`)。当你想要指明一个变量或下标脚注的setter的访问级别要低于或等于该变量或下标脚注的实际访问级别时,使用这种格式的权限级别修饰符,就像Getters and Setters一章中讨论的一样。 + +>声明修饰符的语法 + +>声明修饰符 → class­ | convenience­ | dynamic­ | final­ | infix­ | lazy­ | mutating­ | nonmutating­ | optional­ | override­ | postfix |­ prefix­ | required­ | static­ | unowned­ | unowned­(­safe­)­ | unowned­(­unsafe­)­ | weak­ + +>声明修饰符 → 权限级别修饰符­ +> +>权限级别修饰符 → internal­ internal­(­set­)­ +> +>权限级别修饰符 → private­ private­(­set­)­ +> +>权限级别修饰符 → public­ public­(­set­)­ +­ \ No newline at end of file diff --git a/source/chapter3/06_Attributes.md b/source/chapter3/06_Attributes.md index 0b200cac..03eb1f34 100755 --- a/source/chapter3/06_Attributes.md +++ b/source/chapter3/06_Attributes.md @@ -27,31 +27,28 @@ 将`availability`特性用于声明时,将表示该声明的生命周期会依赖于特定的平台和操作系统版本。 - `availability`特性总会与参数列表一同出现,该参数列表至少有两个参数,参数之间由逗号分隔。第一个参数由以下这些平台名字中的一个起头:iOS, iOSApplicationExtension, OSX, or OSXApplicationExtension。当然,你也可以用一个星号(*)来表示,该声明在上面提到的所有平台上都是有效的。剩下的参数,可以以任何顺序出现,并且可以附加关于声明生命周期的附加信息,包括重要的里程碑。 - - `unavailable`参数表示该声明在特定的平台上是无效的 - -- `introduced`参数表示:特定的平台上,该声明被使用的第一个版本。格式如下:

    `introduced=version number`

    这个version number由一个正的十进制整数或浮点数构成。 - +- `introduced`参数表示:特定的平台上,该声明被使用的第一个版本。格式如下:

    `introduced=version number`

    这里的`version number`由一个正的十进制整数或浮点数构成。 - `deprecated`参数表示:特定的平台上,该声明被建议弃用的第一个版本。格式如下: -

    `deprecated=version number`

    这个version number由一个正的十进制整数或浮点数构成。 - +

    `deprecated=version number`

    这里的`version number`由一个正的十进制整数或浮点数构成。 - `obsoleted`参数表示:特定的平台上,该声明被弃用的第一个版本。格式如下: -

    `deprecated=version number`

    这个version number由一个正的十进制整数或浮点数构成。 +

    `deprecated=version number`

    这里的`version number`由一个正的十进制整数或浮点数构成。 -The message argument is used to provide a textual message that’s displayed by the compiler when emitting a warning or error about the use of a deprecated or obsoleted declaration. It has the following form: -message=message -The message consists of a string literal. -The renamed argument is used to provide a textual message that indicates the new name for a declaration that’s been renamed. The new name is displayed by the compiler when emitting an error about the use of a renamed declaration. It has the following form: -renamed=new name -The new name consists of a string literal. -You can use the renamed argument in conjunction with the unavailable argument and a type alias declaration to indicate to clients of your code that a declaration has been renamed. For example, this is useful when the name of a declaration is changed between releases of a framework or library. +- `message`参数用来提供文本信息,并在因使用建议弃用或者被弃用的声明而遇到警告或错误时,由编译器抛出。格式如下: +

    `message=message`

    这里的`message`由一个字符串文字构成。 + +- `renamed`参数用来提供文本信息,用以表示被重命名的声明的新名字。当使用这个重命名的声明遇到错误时,该新名字会被编译器显示出来。格式如下: +

    `renamed=new name`

    这里的`new name`由一个字符串文字构成。 + +你可以将`renamed`参数和`unavailable`参数以及类型别名声明组合使用,以向用户表示:在你的代码中,一个声明已经被重命名。当一个声明的名字在一个框架或者库的不同发布版本间发生变化时,这会相当管用。 + +```swift // First release protocol MyProtocol { // protocol definition @@ -63,29 +60,15 @@ protocol MyRenamedProtocol { @availability(*, unavailable, renamed="MyRenamedProtocol") typealias MyProtocol = MyRenamedProtocol -You can apply multiple availability attributes on a single declaration to specify the declaration’s availability on different platforms. The compiler uses an availability attribute only when the attribute specifies a platform that matches the current target platform. +``` -`assignment` -该特性用于修饰重载了复合赋值运算符的函数。重载了复合赋值运算符的函数必需将它们的初始输入参数标记为`inout`。如何使用`assignment`特性的一个例子,请见:[复合赋值运算符]()。 - -`class_protocol` - -该特性用于修饰一个协议表明该协议只能被类类型采用[待改:adopted]。 - -如果你用`objc`特性修饰一个协议,`class_protocol`特性就会隐式地应用到该协议,因此无需显式地用`class_protocol`特性标记该协议。 +你可以在一个单独的声明上使用多个`availability`特性,以详细说明该声明在不同平台上的有效性。编译器只有在当前的目标平台和`availability`特性中指定的平台匹配时,才会使用`availability`特性 `exported` 该特性用于修饰导入声明,以此来导出已导入的模块,子模块,或当前模块的声明。如果另一个模块导入了当前模块,那么那个模块可以访问当前模块的导出项。 -`final` - -该特性用于修饰一个类或类中的属性,方法,以及下标成员。如果用它修饰一个类,那么这个类则不能被继承。如果用它修饰类中的属性,方法或下标,则表示在子类中,它们不能被重写。 - -`lazy` - -该特性用于修饰类或结构体中的存储型变量属性,表示该属性的初始值最多只被计算和存储一次,且发生在第一次访问它时。如何使用`lazy`特性的一个例子,请见:[惰性存储型属性]()。 `noreturn`