【问题标题】:Swift UnsafeMutableRawPointer ErrorSwift UnsafeMutableRawPointer 错误
【发布时间】:2018-12-27 21:33:22
【问题描述】:

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

【问题讨论】:

  • 有趣,看起来像一个临时错误。它已在 master 上修复(目前无法确认它是否已在最新的 Swift 4.2 快照中修复)。作为一种解决方法,您可以使用case let x where x == &SessionRunningContext:
  • ... 或 switch context { case .some(&SessionRunningContext): ...if context == &SessionRunningContext { ...
  • (在最新的 4.2 快照中确实已修复)
  • 已在 Xcode 10 beta 4 中修复。

标签: ios swift xcode unsafemutablepointer


【解决方案1】:

这似乎是 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

}

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多