Swift UnsafeMutableRawPointer错误

时间:2018-07-19 16:35:45

标签: ios swift xcode unsafemutablepointer

使用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:

1 个答案:

答案 0 :(得分:3)

这似乎是Xcode 10 beta 3随附的Swift中的一个错误, Xcode 10.0 beta 4(10L213o)已修复该问题。

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

具有子句的模式(此属性归@Hamish所用):

data.frame

可选模式:

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

}

一个简单的if语句:

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

}

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

  

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