@ -10,6 +10,9 @@
|
|||||||
|
|
||||||
> 2.1
|
> 2.1
|
||||||
> 校对:[shanks](http://codebuild.me),2015-11-01
|
> 校对:[shanks](http://codebuild.me),2015-11-01
|
||||||
|
>
|
||||||
|
> 2.2
|
||||||
|
> 翻译+校对:[SketchK](https://github.com/SketchK) 2016-05-16
|
||||||
|
|
||||||
本页包含内容:
|
本页包含内容:
|
||||||
|
|
||||||
@ -89,9 +92,9 @@ var songCount = 0
|
|||||||
|
|
||||||
for item in library {
|
for item in library {
|
||||||
if item is Movie {
|
if item is Movie {
|
||||||
++movieCount
|
movieCount += 1
|
||||||
} else if item is Song {
|
} else if item is Song {
|
||||||
++songCount
|
songCount += 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -164,12 +167,10 @@ Swift 为不确定类型提供了两种特殊的类型别名:
|
|||||||
<a name="anyobject"></a>
|
<a name="anyobject"></a>
|
||||||
### `AnyObject` 类型
|
### `AnyObject` 类型
|
||||||
|
|
||||||
当在工作中使用 Cocoa APIs 时,我们经常会接收到一个 `[AnyObject]` 类型的数组,或者说“一个任意类型对象的数组”。这是因为 Objective-C 没有明确的类型化数组。但是,你常常可以从 API 提供的信息来确定数组中对象的类型。
|
当我们使用 Cocoa APIs 时,我们会接收到一个 `[AnyObject]` 类型的数组,或者说“一个任意类型对象的数组”。Objective-C现在支持明确的数组类型,但早期版本的Objective-C并没有这个功能。不管怎样,你都可以确信API提供的信息能够正确的表明数组中的元素类型。
|
||||||
|
|
||||||
> 译者注
|
|
||||||
> 这段文档似乎没有及时更新,从 Xcode 7 和 Swift 2.0 开始,由于 Objective-C 引入了轻量泛型,集合类型已经可以类型化了,在 Swift 中使用 Cocoa API 也越来越少遇到 `AnyObject` 类型了。详情请参阅 [Lightweight Generics](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html#//apple_ref/doc/uid/TP40014216-CH4-ID173) 和 [Collection Classes](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html#//apple_ref/doc/uid/TP40014216-CH6-ID69)。
|
|
||||||
|
|
||||||
在这些情况下,你可以使用强制形式的类型转换(`as`)来下转数组中的每一项到比 `AnyObject` 更明确的类型,不需要可选解包(optional unwrapping)。
|
在这些情况下,你可以使用强制形式的类型转换(`as!`)来下转数组中的每一项到比 `AnyObject` 更明确的类型,不需要可选解包(optional unwrapping)。
|
||||||
|
|
||||||
下面的示例定义了一个 `[AnyObject]` 类型的数组并填入三个 `Movie` 类型的实例:
|
下面的示例定义了一个 `[AnyObject]` 类型的数组并填入三个 `Movie` 类型的实例:
|
||||||
|
|
||||||
|
|||||||
@ -9,14 +9,17 @@
|
|||||||
> 翻译+校对:[SergioChan](https://github.com/SergioChan)
|
> 翻译+校对:[SergioChan](https://github.com/SergioChan)
|
||||||
|
|
||||||
> 2.1
|
> 2.1
|
||||||
> 校对:[shanks](http://codebuild.me),2015-11-01
|
> 校对:[shanks](http://codebuild.me),2015-11-01
|
||||||
|
>
|
||||||
|
> 2.2
|
||||||
|
> 翻译+校对:[SketchK](https://github.com/SketchK) 2016-05-16
|
||||||
|
|
||||||
本页包含内容:
|
本页包含内容:
|
||||||
|
|
||||||
- [嵌套类型实践](#nested_types_in_action)
|
- [嵌套类型实践](#nested_types_in_action)
|
||||||
- [引用嵌套类型](#referring_to_nested_types)
|
- [引用嵌套类型](#referring_to_nested_types)
|
||||||
|
|
||||||
枚举常被用于为特定类或结构体实现某些功能。类似的,也能够在某个复杂的类型中,方便地定义工具类或结构体来使用。为了实现这种功能,Swift 允许你定义嵌套类型,可以在支持的类型中定义嵌套的枚举、类和结构体。
|
枚举常被用于为特定类或结构体实现某些功能。类似的,枚举可以方便的定义工具类或结构体,从而为某个复杂的类型所使用。为了实现这种功能,Swift 允许你定义嵌套类型,可以在支持的类型中定义嵌套的枚举、类和结构体。
|
||||||
|
|
||||||
要在一个类型中嵌套另一个类型,将嵌套类型的定义写在其外部类型的`{}`内,而且可以根据需要定义多级嵌套。
|
要在一个类型中嵌套另一个类型,将嵌套类型的定义写在其外部类型的`{}`内,而且可以根据需要定义多级嵌套。
|
||||||
|
|
||||||
|
|||||||
@ -10,6 +10,9 @@
|
|||||||
|
|
||||||
> 2.1
|
> 2.1
|
||||||
> 校对:[shanks](http://codebuild.me)
|
> 校对:[shanks](http://codebuild.me)
|
||||||
|
>
|
||||||
|
> 2.2
|
||||||
|
> 翻译+校对:[SketchK](https://github.com/SketchK) 2016-05-16
|
||||||
|
|
||||||
本页包含内容:
|
本页包含内容:
|
||||||
|
|
||||||
@ -106,7 +109,7 @@ print("A marathon is \(aMarathon) meters long")
|
|||||||
扩展能为类添加新的便利构造器,但是它们不能为类添加新的指定构造器或析构器。指定构造器和析构器必须总是由原始的类实现来提供。
|
扩展能为类添加新的便利构造器,但是它们不能为类添加新的指定构造器或析构器。指定构造器和析构器必须总是由原始的类实现来提供。
|
||||||
|
|
||||||
> 注意
|
> 注意
|
||||||
如果你使用扩展为一个值类型添加构造器,且该值类型的原始实现中未定义任何定制的构造器时,你可以在扩展中的构造器里调用逐一成员构造器。如果该值类型为所有存储型属性提供了默认值,你还可以在扩展中的构造器里调用默认构造器。
|
如果你使用扩展为一个值类型添加构造器,同时该值类型的原始实现中未定义任何定制的构造器且所有存储属性提供了默认值,那么我们就可以在扩展中的构造器里调用默认构造器和逐一成员构造器。
|
||||||
正如在[值类型的构造器代理](./14_Initialization.html#initializer_delegation_for_value_types)中描述的,如果你把定制的构造器写在值类型的原始实现中,上述规则将不再适用。
|
正如在[值类型的构造器代理](./14_Initialization.html#initializer_delegation_for_value_types)中描述的,如果你把定制的构造器写在值类型的原始实现中,上述规则将不再适用。
|
||||||
|
|
||||||
下面的例子定义了一个用于描述几何矩形的结构体 `Rect`。这个例子同时定义了两个辅助结构体 `Size` 和 `Point`,它们都把 `0.0` 作为所有属性的默认值:
|
下面的例子定义了一个用于描述几何矩形的结构体 `Rect`。这个例子同时定义了两个辅助结构体 `Size` 和 `Point`,它们都把 `0.0` 作为所有属性的默认值:
|
||||||
@ -223,11 +226,10 @@ someInt.square()
|
|||||||
|
|
||||||
```swift
|
```swift
|
||||||
extension Int {
|
extension Int {
|
||||||
subscript(var digitIndex: Int) -> Int {
|
subscript(digitIndex: Int) -> Int {
|
||||||
var decimalBase = 1
|
var decimalBase = 1
|
||||||
while digitIndex > 0 {
|
for _ in 0..<digitIndex {
|
||||||
decimalBase *= 10
|
decimalBase *= 10
|
||||||
--digitIndex
|
|
||||||
}
|
}
|
||||||
return (self / decimalBase) % 10
|
return (self / decimalBase) % 10
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,6 +11,9 @@
|
|||||||
> 2.1
|
> 2.1
|
||||||
> 翻译:[小铁匠Linus](https://github.com/kevin833752)
|
> 翻译:[小铁匠Linus](https://github.com/kevin833752)
|
||||||
> 校对:[shanks](http://codebuild.me),2015-11-01
|
> 校对:[shanks](http://codebuild.me),2015-11-01
|
||||||
|
>
|
||||||
|
> 2.2
|
||||||
|
> 翻译+校对:[SketchK](https://github.com/SketchK) 2016-05-16
|
||||||
|
|
||||||
本页包含内容:
|
本页包含内容:
|
||||||
|
|
||||||
@ -348,7 +351,7 @@ protocol DiceGameDelegate {
|
|||||||
|
|
||||||
`DiceGame` 协议可以被任意涉及骰子的游戏采纳。`DiceGameDelegate` 协议可以被任意类型采纳,用来追踪 `DiceGame` 的游戏过程。
|
`DiceGame` 协议可以被任意涉及骰子的游戏采纳。`DiceGameDelegate` 协议可以被任意类型采纳,用来追踪 `DiceGame` 的游戏过程。
|
||||||
|
|
||||||
如下所示,`SnakesAndLadders` 是 [Control Flow](./05_Control_Flow.html) 章节引入的蛇梯棋游戏的新版本。新版本使用 `Dice` 实例作为骰子,并且实现了 `DiceGame` 和 `DiceGameDelegate` 协议,后者用来记录游戏的过程:
|
如下所示,`SnakesAndLadders` 是 [控制流](./05_Control_Flow.html) 章节引入的蛇梯棋游戏的新版本。新版本使用 `Dice` 实例作为骰子,并且实现了 `DiceGame` 和 `DiceGameDelegate` 协议,后者用来记录游戏的过程:
|
||||||
|
|
||||||
```swift
|
```swift
|
||||||
class SnakesAndLadders: DiceGame {
|
class SnakesAndLadders: DiceGame {
|
||||||
@ -383,7 +386,7 @@ class SnakesAndLadders: DiceGame {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
关于这个蛇梯棋游戏的详细描述请参阅 [Control Flow](./05_Control_Flow.html) 章节中的 [Break](./05_Control_Flow.html#break) 部分。
|
关于这个蛇梯棋游戏的详细描述请参阅 [控制流](./05_Control_Flow.html) 章节中的 [Break](./05_Control_Flow.html#break) 部分。
|
||||||
|
|
||||||
这个版本的游戏封装到了 `SnakesAndLadders` 类中,该类采纳了 `DiceGame` 协议,并且提供了相应的可读的 `dice` 属性和 `play()` 方法。( `dice` 属性在构造之后就不再改变,且协议只要求 `dice` 为可读的,因此将 `dice` 声明为常量属性。)
|
这个版本的游戏封装到了 `SnakesAndLadders` 类中,该类采纳了 `DiceGame` 协议,并且提供了相应的可读的 `dice` 属性和 `play()` 方法。( `dice` 属性在构造之后就不再改变,且协议只要求 `dice` 为可读的,因此将 `dice` 声明为常量属性。)
|
||||||
|
|
||||||
@ -408,7 +411,7 @@ class DiceGameTracker: DiceGameDelegate {
|
|||||||
print("The game is using a \(game.dice.sides)-sided dice")
|
print("The game is using a \(game.dice.sides)-sided dice")
|
||||||
}
|
}
|
||||||
func game(game: DiceGame, didStartNewTurnWithDiceRoll diceRoll: Int) {
|
func game(game: DiceGame, didStartNewTurnWithDiceRoll diceRoll: Int) {
|
||||||
++numberOfTurns
|
numberOfTurns += 1
|
||||||
print("Rolled a \(diceRoll)")
|
print("Rolled a \(diceRoll)")
|
||||||
}
|
}
|
||||||
func gameDidEnd(game: DiceGame) {
|
func gameDidEnd(game: DiceGame) {
|
||||||
@ -726,7 +729,7 @@ for object in objects {
|
|||||||
|
|
||||||
> 注意
|
> 注意
|
||||||
> 可选的协议要求只能用在标记 `@objc` 特性的协议中。
|
> 可选的协议要求只能用在标记 `@objc` 特性的协议中。
|
||||||
> 该特性表示协议将暴露给 Objective-C 代码,详情参见[`Using Swift with Cocoa and Objective-C(Swift 2.1)`](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/index.html#//apple_ref/doc/uid/TP40014216)。即使你不打算和 Objective-C 有什么交互,如果你想要指定可选的协议要求,那么还是要为协议加上 `@obj` 特性。
|
> 该特性表示协议将暴露给 Objective-C 代码,详情参见[`Using Swift with Cocoa and Objective-C(Swift 2.2)`](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/index.html#//apple_ref/doc/uid/TP40014216)。即使你不打算和 Objective-C 有什么交互,如果你想要指定可选的协议要求,那么还是要为协议加上 `@objc` 特性。
|
||||||
> 还需要注意的是,标记 `@objc` 特性的协议只能被继承自 Objective-C 类的类或者 `@objc` 类采纳,其他类以及结构体和枚举均不能采纳这种协议。
|
> 还需要注意的是,标记 `@objc` 特性的协议只能被继承自 Objective-C 类的类或者 `@objc` 类采纳,其他类以及结构体和枚举均不能采纳这种协议。
|
||||||
|
|
||||||
下面的例子定义了一个名为 `Counter` 的用于整数计数的类,它使用外部的数据源来提供每次的增量。数据源由 `CounterDataSource` 协议定义,包含两个可选要求:
|
下面的例子定义了一个名为 `Counter` 的用于整数计数的类,它使用外部的数据源来提供每次的增量。数据源由 `CounterDataSource` 协议定义,包含两个可选要求:
|
||||||
|
|||||||
@ -12,7 +12,7 @@
|
|||||||
> 2.1
|
> 2.1
|
||||||
> 校对:[shanks](http://codebuild.me),2015-11-01
|
> 校对:[shanks](http://codebuild.me),2015-11-01
|
||||||
|
|
||||||
> 2.2:翻译+校对:[Lanford](https://github.com/LanfordCai),2016-04-08
|
> 2.2:翻译+校对:[Lanford](https://github.com/LanfordCai),2016-04-08 [SketchK](https://github.com/SketchK) 2016-05-16
|
||||||
|
|
||||||
本页包含内容:
|
本页包含内容:
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user