3

使用 Swift 3,我得到了这个,没有任何错误:

private var SessionRunningContext = 0

func addObservers() {
   self.session.addObserver(self, forKeyPath: "running", options: .new, context: &SessionRunningContext)
}

func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
   let newValue: AnyObject? = change![NSKeyValueChangeKey.newKey] as AnyObject?
   switch context! {
     case &SessionRunningContext:
         // Do something
   }
}

但是,当我在 iOS 12 Xcode Beta 上构建它时,我收到一条错误消息:

使用无关的“&”

对于这一行:

case &SessionRunningContext:
4

1 回答 1

4

这似乎是 Xcode 10 beta 3 附带的 Swift 中的一个错误,它已在 Xcode 10.0 beta 4 (10L213o) 中修复。

Xcode 10 beta 3 的可能解决方法是:

带有 where 子句的模式(归因于@Hamish):

switch context {
    case let x where x == &SessionRunningContext:
    // Do something

}

可选模式:

switch context {
    case .some(&SessionRunningContext):
    // Do something

}

一个简单的 if 语句:

if context == &SessionRunningContext {
     // Do something

}

另请注意,只有全局变量或静态属性的地址提供了适合作为上下文指针的持久指针,而不是实例属性的地址,请比较与 C 指针交互中的“安全性与指针参数转换” :

这些转换产生的指针只保证在调用期间有效。即使您将相同的变量、数组或字符串作为多个指针参数传递,您每次都可能收到不同的指针。一个例外是全局或静态存储变量。您可以安全地使用全局变量的地址作为持久的唯一指针值,例如:作为 KVO 上下文参数。

于 2018-07-19T17:54:23.493 回答