首页 > 解决方案 > Swift 4 切换到新的观察 API

问题描述

我在使用observeSwift 4 中的新 API 时遇到问题。

player = AVPlayer()
player?.observe(\.currentItem.status, options: [.new], changeHandler: { [weak self] (player, newValue) in
    if let status = AVPlayer.Status(rawValue: (newValue as! NSNumber).intValue) {

   }
 }

但我得到一个错误

在没有更多上下文的情况下,表达式的类型是模棱两可的。

我如何解决它?不确定keyPath语法。

在上面的闭包中提取 AVPlayerStatus 也有警告

从 'NSKeyValueObservedChange' 转换为不相关类型 'NSNumber' 总是失败”

标签: swiftavfoundationswift4avplayerkey-value-observing

解决方案


currentItem是 的可选属性AVPlayer。以下在 Swift 4.2/Xcode 10 中编译(注意密钥路径中的附加问号):

let observer = player.observe(\.currentItem?.status, options: [.new]) {
    (player, change) in
    guard let optStatus = change.newValue else {
        return // No new value provided by observer
    }
    if let status = optStatus {
        // `status` is the new status, type is `AVPlayerItem.Status`
    } else {
        // New status is `nil`
    }
}

观察到的属性是一个可选的AVPlayer.Status?,因此 change.newValue在回调内部是一个“双重可选”AVPlayer.Status??并且必须被解包两次。

它可能无法在较旧的 Swift 版本中编译,比较 Swift 的 'observe()' 不适用于带有选项的关键路径?在 Swift 论坛中。


推荐阅读