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()
}
我在使用 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()
}