可选链接不适用于可选协议要求

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 都有效。