可选链接不适用于可选协议要求
Optional chaining not working for optional protocol requirements
我正在关注 Apple 的 this example,但可选链接无法按预期工作。
有一个带有可选 属性 和功能的协议:
@objc protocol CounterDataSource {
optional func incrementForCount(count: Int) -> Int
optional var fixedIncrement: Int { get }
}
符合上述协议的class:
class ThreeSource: CounterDataSource {
let fixedIncrement = 3
}
还有一个 class,带有符合该协议的可选 属性(数据源):
@objc class Counter {
var count = 0
var dataSource: CounterDataSource?
func increment() {
if let amount = dataSource?.incrementForCount?(count) {
count += amount
} else if let amount = dataSource?.fixedIncrement {
count += amount
}
}
}
终于到了使用 Counter 实例的时候了,它有一个非 nil 数据源 属性,它的行为并不像预期的那样:
var counter = Counter()
counter.dataSource = ThreeSource()
for _ in 1...4 {
counter.increment()
println(counter.count)
}
如果我没记错,根据教程,我们应该打印 3、6、9、12。但我只打印 0、0、0、0。
这里是 class Counter 中的可选链接,预计会将值 3(由于 ThreeSource 中的 fixedIncrement 属性)分配给 amount:
} else if let amount = dataSource?.fixedIncrement {
count += amount
}
但是这不起作用,那个分支没有执行。
代码有什么问题吗?或者这可能是一个错误?
事实证明,Swift 编程语言 (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html) 的 iBook 内容的网站版本显示了用 @objc 声明的 ThreeSource。这样做或从 NSObject
派生 ThreeSource 都有效。
我正在关注 Apple 的 this example,但可选链接无法按预期工作。
有一个带有可选 属性 和功能的协议:
@objc protocol CounterDataSource {
optional func incrementForCount(count: Int) -> Int
optional var fixedIncrement: Int { get }
}
符合上述协议的class:
class ThreeSource: CounterDataSource {
let fixedIncrement = 3
}
还有一个 class,带有符合该协议的可选 属性(数据源):
@objc class Counter {
var count = 0
var dataSource: CounterDataSource?
func increment() {
if let amount = dataSource?.incrementForCount?(count) {
count += amount
} else if let amount = dataSource?.fixedIncrement {
count += amount
}
}
}
终于到了使用 Counter 实例的时候了,它有一个非 nil 数据源 属性,它的行为并不像预期的那样:
var counter = Counter()
counter.dataSource = ThreeSource()
for _ in 1...4 {
counter.increment()
println(counter.count)
}
如果我没记错,根据教程,我们应该打印 3、6、9、12。但我只打印 0、0、0、0。
这里是 class Counter 中的可选链接,预计会将值 3(由于 ThreeSource 中的 fixedIncrement 属性)分配给 amount:
} else if let amount = dataSource?.fixedIncrement {
count += amount
}
但是这不起作用,那个分支没有执行。
代码有什么问题吗?或者这可能是一个错误?
事实证明,Swift 编程语言 (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html) 的 iBook 内容的网站版本显示了用 @objc 声明的 ThreeSource。这样做或从 NSObject
派生 ThreeSource 都有效。