去除行末冗余空格

This commit is contained in:
bqlin
2018-02-14 19:53:19 +08:00
parent ad1d3944bc
commit 34f8d0c6b9
27 changed files with 264 additions and 264 deletions

View File

@ -16,7 +16,7 @@
> 翻译+校对:[SketchK](https://github.com/SketchK)
>
> 3.0
> 校对:[CMB](https://github.com/chenmingbiao)版本日期2016-09-13
> 校对:[CMB](https://github.com/chenmingbiao)版本日期2016-09-13
> 3.0.1shanks2016-11-13
本页包含内容:
@ -189,7 +189,7 @@ print("And another one: \(generator.random())")
如果你在协议中定义了一个实例方法,该方法会改变遵循该协议的类型的实例,那么在定义协议时需要在方法前加 `mutating` 关键字。这使得结构体和枚举能够遵循此协议并满足此方法要求。
> 注意
> 注意
> 实现协议中的 `mutating` 方法时,若是类类型,则不用写 `mutating` 关键字。而对于结构体和枚举,则必须写 `mutating` 关键字。
如下所示,`Togglable` 协议只要求实现一个名为 `toggle` 的实例方法。根据名称的暗示,`toggle()` 方法将改变实例属性,从而切换遵循该协议类型的实例的状态。
@ -250,7 +250,7 @@ class SomeClass: SomeProtocol {
关于 `required` 构造器的更多内容,请参考[必要构造器](./14_Initialization.html#required_initializers)。
> 注意
> 注意
> 如果类已经被标记为 `final`,那么不需要在协议构造器的实现中使用 `required` 修饰符,因为 `final` 类不能有子类。关于 `final` 修饰符的更多内容,请参见[防止重写](./13_Inheritance.html#preventing_overrides)。
如果一个子类重写了父类的指定构造器,并且该构造器满足了某个协议的要求,那么该构造器的实现需要同时标注 `required``override` 修饰符:
@ -292,7 +292,7 @@ class SomeSubClass: SomeSuperClass, SomeProtocol {
* 作为常量、变量或属性的类型
* 作为数组、字典或其他容器中的元素类型
> 注意
> 注意
> 协议是一种类型,因此协议类型的名称应与其他类型(例如 `Int``Double``String`)的写法相同,使用大写字母开头的驼峰式写法,例如(`FullyNamed` 和 `RandomNumberGenerator`)。
下面是将协议作为类型使用的例子:
@ -450,7 +450,7 @@ game.play()
即便无法修改源代码,依然可以通过扩展令已有类型遵循并符合协议。扩展可以为已有类型添加属性、方法、下标以及构造器,因此可以符合协议中的相应要求。详情请在[扩展](./21_Extensions.html)章节中查看。
> 注意
> 注意
> 通过扩展令已有类型遵循并符合协议时,该类型的所有实例也会随之获得协议中定义的各项功能。
例如下面这个 `TextRepresentable` 协议,任何想要通过文本表示一些内容的类型都可以实现该协议。这些想要表示的内容可以是实例本身的描述,也可以是实例当前状态的文本描述:
@ -517,7 +517,7 @@ print(somethingTextRepresentable.textualDescription)
// 打印 “A hamster named Simon”
```
> 注意
> 注意
> 即使满足了协议的所有要求,类型也不会自动遵循协议,必须显式地遵循协议。
<a name="collections_of_protocol_types"></a>
@ -611,7 +611,7 @@ protocol SomeClassOnlyProtocol: class, SomeInheritedProtocol {
在以上例子中,协议 `SomeClassOnlyProtocol` 只能被类类型遵循。如果尝试让结构体或枚举类型遵循该协议,则会导致编译错误。
> 注意
> 注意
> 当协议定义的要求需要遵循协议的类型必须是引用语义而非值语义时,应该采用类类型专属协议。关于引用语义和值语义的更多内容,请查看[结构体和枚举是值类型](./09_Classes_and_Structures.html#structures_and_enumerations_are_value_types)和[类是引用类型](./09_Classes_and_Structures.html#classes_are_reference_types)。
<a name="protocol_composition"></a>
@ -771,7 +771,7 @@ for object in objects {
`CounterDataSource` 协议定义了一个可选方法 `increment(forCount:)` 和一个可选属性 `fiexdIncrement`,它们使用了不同的方法来从数据源中获取适当的增量值。
> 注意
> 注意
> 严格来讲,`CounterDataSource` 协议中的方法和属性都是可选的,因此遵循协议的类可以不实现这些要求,尽管技术上允许这样做,不过最好不要这样写。
`Counter` 类含有 `CounterDataSource?` 类型的可选属性 `dataSource`,如下所示:
@ -891,7 +891,7 @@ print("And here's a random Boolean: \(generator.randomBool())")
可以通过协议扩展来为协议要求的属性、方法以及下标提供默认的实现。如果遵循协议的类型为这些要求提供了自己的实现,那么这些自定义实现将会替代扩展中的默认实现被使用。
> 注意
> 注意
> 通过协议扩展为协议要求提供的默认实现和可选的协议要求不同。虽然在这两种情况下,遵循协议的类型都无需自己实现这些要求,但是通过扩展提供的默认实现可以直接调用,而无需使用可选链式调用。
例如,`PrettyTextRepresentable` 协议继承自 `TextRepresentable` 协议,可以为其提供一个默认的 `prettyTextualDescription` 属性,只是简单地返回 `textualDescription` 属性的值:
@ -938,5 +938,5 @@ print(hamsters.textualDescription)
// 打印 “[A hamster named Murray, A hamster named Morgan, A hamster named Maurice]”
```
> 注意
> 注意
> 如果多个协议扩展都为同一个协议要求提供了默认实现,而遵循协议的类型又同时满足这些协议扩展的限制条件,那么将会使用限制条件最多的那个协议扩展提供的默认实现。