代码之家  ›  专栏  ›  技术社区  ›  Deepak Sharma

Swift 4切换到新API

  •  3
  • Deepak Sharma  · 技术社区  · 6 年前

    我在新的工作上有困难 observe

    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也有一个警告

    1 回复  |  直到 6 年前
        1
  •  8
  •   Martin R    6 年前

    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?