diff --git a/source/02_language_guide/01_The_Basics.md b/source/02_language_guide/01_The_Basics.md index 4fad7363..8eebdc09 100755 --- a/source/02_language_guide/01_The_Basics.md +++ b/source/02_language_guide/01_The_Basics.md @@ -617,7 +617,7 @@ if let firstNumber = Int("4") { 有时候在程序架构中,第一次被赋值之后,可以确定一个可选类型_总会_有值。在这种情况下,每次都要判断和解析可选值是非常低效的,因为可以确定它总会有值。 -这种类型的可选状态被定义为隐式解析可选类型(implicitly unwrapped optionals)。把想要用作可选的类型的后面的问号(`String?`)改成感叹号(`String!`)来声明一个隐式解析可选类型。 +这种类型的可选状态被定义为隐式解析可选类型(implicitly unwrapped optionals)。把想要用作可选的类型的后面的问号(`String?`)改成感叹号(`String!`)来声明一个隐式解析可选类型。与其在使用时把感叹号放在可选类型的名称的后面,你可以在定义它时,直接把感叹号放在可选类型的后面。 当可选类型被第一次赋值之后就可以确定之后一直有值的时候,隐式解析可选类型非常有用。隐式解析可选类型主要被用在 Swift 中类的构造过程中,请参考 [无主引用以及隐式解析可选属性](./24_Automatic_Reference_Counting.md#unowned-references-and-implicitly-unwrapped-optional-properties)。 @@ -631,13 +631,15 @@ let assumedString: String! = "An implicitly unwrapped optional string." let implicitString: String = assumedString // 不需要感叹号 ``` -你可以把隐式解析可选类型当做一个可以自动解析的可选类型。你要做的只是声明的时候把感叹号放到类型的结尾,而不是每次取值的可选名字的结尾。 +你可以把隐式解析可选类型当做一个可以自动解析的可选类型。当你使用一个隐式解析可选值时,Swift 首先会把它当作普通的可选值;如果它不能被当成可选类型使用,Swift 会强制解析可选值。在以上的代码中,可选值 `assumedString` 在把自己的值赋给 `implicitString` 之前会被强制解析,原因是 `implicitString` 本身的类型是非可选类型的 `String`。在下面的代码中,`optionalString` 并没有显式的数据类型。那么根据类型推断,它就是一个普通的可选类型。 +```swift +let optionalString = assumedString +// optionalString 的类型是 "String?",assumedString 也没有被强制解析。 +``` -> 注意 -> -> 如果你在隐式解析可选类型没有值的时候尝试取值,会触发运行时错误。和你在没有值的普通可选类型后面加一个惊叹号一样。 +如果你在隐式解析可选类型没有值的时候尝试取值,会触发运行时错误。和你在没有值的普通可选类型后面加一个感叹号一样。 -你仍然可以把隐式解析可选类型当做普通可选类型来判断它是否包含值: +你可以把隐式解析可选类型当做普通可选类型来判断它是否包含值: ```swift if assumedString != nil { diff --git a/source/02_language_guide/10_Properties.md b/source/02_language_guide/10_Properties.md index af1af508..d63180df 100755 --- a/source/02_language_guide/10_Properties.md +++ b/source/02_language_guide/10_Properties.md @@ -225,7 +225,12 @@ print("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volume)") 属性观察器监控和响应属性值的变化,每次属性被设置值的时候都会调用属性观察器,即使新值和当前值相同的时候也不例外。 -你可以为除了延时加载存储属性之外的其他存储属性添加属性观察器,你也可以在子类中通过重写属性的方式为继承的属性(包括存储属性和计算属性)添加属性观察器。你不必为非重写的计算属性添加属性观察器,因为你可以直接通过它的 setter 监控和响应值的变化。属性重写请参考 [重写](./13_Inheritance.md#overriding)。 +你可以在以下位置添加属性观察器: +* 自定义的存储属性 +* 继承的存储属性 +* 继承的计算属性 + +对于继承的属性,你可以在子类中通过重写属性的方式为它添加属性观察器。对于自定义的计算属性来说,使用它的 setter 监控和响应值的变化,而不是尝试创建观察器。属性重写请参考 [重写](./13_Inheritance.md#overriding)。 可以为属性添加其中一个或两个观察器: