我刚刚更新到 Swift 4 和 Xcode 9,并收到以下代码的 (swiftlint) 警告,告诉我现在应该使用 KVO:
警告:
(基于块的 KVO 违规:在使用 Swift 3.2 或更高版本时,更喜欢带有键路径的新的基于块的 KVO API。(block_based_kvo))
旧代码:
override func observeValue(forKeyPath keyPath: String?,
of object: Any?,
change: [NSKeyValueChangeKey : Any]?,
context: UnsafeMutableRawPointer?) {
if keyPath == "outputVolume"{
guard let newKey = change?[NSKeyValueChangeKey.newKey] as? NSNumber else {
fatalError("Could not unwrap optional content of new key")
}
let volume = newKey.floatValue
print("volume " + volume.description)
}
}
我尝试修复:
let audioSession = AVAudioSession.sharedInstance()
audioSession.observe(\.outputVolume) { (av, change) in
print("volume \(av.outputVolume)")
}
苹果在这里声称大多数属性应该是dynamic
(我知道这是 AVPlayer 而不是 AVAudioSession)。我查了一下,但在 AVPlayer 属性中找不到任何dynamic
语句,并且想知道它是如何工作的(如果我没记错的话,这些是 KVO 工作所必需的)。
编辑:
我不确定它是否不会触发,因为它根本不起作用,或者是由于我尝试存档的原因。一般来说,我希望收到有关通过推动硬件音量摇杆触发的音量变化的通知。