Swift 4 切换到新观察 API

Swift 4 switch to new observe API

我在使用 Swift 4 中的新 observe 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) {

   }
 }

但是我得到一个错误

Type of expression is ambiguous without more context.

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

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

Cast from 'NSKeyValueObservedChange' to unrelated type 'NSNumber' always fails"

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’s ‘observe()’ doesn’t work for key paths with optionals? 在 Swift 论坛中。

您也可以使用播放器实例而不是闭包中的 change(NSKeyValueObservedChange) 来获取您需要的内容。



//Declare observation token at class level for managing the observation lifetime.

    var kvoToken: NSKeyValueObservation?

//Add your observer

    kvoToken = player.observe(\.currentItem?.status) { (player, _) in
                switch player.currentItem?.status {
                case.readyToPlay:
                    print("Ready to play")
                case .failed:
                    print("failed")
                case .unknown:
                    print("unknown")
                default:
                    print("deafult")
                }
            }

//In deinit, invalidate the token.

    deinit {
        kvoToken?.invalidate()
    }