swift - Swift 4 切换到新的观察 API
问题描述
我在使用observe
Swift 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' 总是失败”
解决方案
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 论坛中。
推荐阅读
- javascript - 我在 CytoscapeComponent 中编写的 console.log 的工作次数与我单击 cy 屏幕时单击屏幕上的按钮的次数一样多
- python - 如何模拟在模拟对象上调用的函数,以返回特定值
- php - PHP循环槽文件夹并删除旧文件/空文件夹
- electron - 节点通知程序在生产中不工作 | 我做错了什么?
- reactjs - 我们可以在 React 应用程序中覆盖 webpack DefinePlugin 的变量吗
- node.js - Runtime.HandlerNotFound aws lambda node.js
- css - 如何使用滚动捕捉 CSS 控制/更改动画的速度?
- python - Tableview 列自动调整
- java - 如何在 Querydsl 中实例化`PostgreSQLQuery`?
- javascript - 在我的 chrome 扩展程序和网站之间共享 cookie