Swift 4.2, если let не работает с CMTime в Xcode 11.2
С момента обновления до Xcode 11.2 и создания и запуска моего приложения блок Swift if let сообщает об ошибке, которая всегда работала иначе. Вот код, который не работает.
public func remoteClient(receivedData data: [String : Any]?, fromPeer peerID: MCPeerID) {
let params = data?["params"] as? [String:Any]
NSLog("Received image \(params!["timestamp"])")
if let imgData = params?["image"] as? Data, let timeStamp = params?["timestamp"] as? CMTime
{
NSLog("Handling image response")
handleImageResponse(imgData, timeStamp: timeStamp)
} else {
NSLog("Image response failed")
}
}
А вот что печатается на консоли
2019-11-02 23:47:52.342324+0530 MyApp [312:9779] Received image Optional(CMTime: {34515835925000/1000000000 = 34515.836})
2019-11-02 23:47:52.343251+0530 MyApp[312:9779] Image response failed
Удаление проверки CMTime в 'if let' решает проблему, но как тогда извлечь CMTime из словаря параметров?
Интересно, что внезапно изменилось при сборке с Xcode 11.2?
params!["timestamp"] печатает CMTime в консоли, что тогда не удается в назначении if let?
И это CMTime не работает, я пробовал это:
if let imgData = params?["image"] as? Data, let timeStamp = params?["timestamp"] as? Any {
let time = timeStamp as! CMTime
}
И у меня вылетает:
Could not cast value of type 'CMTimeAsValue' (0x10ce321d8) to '__C.CMTime' (0x2355bab00).
1 ответ
Решение
Видимо время хранится в словаре как NSValue
упаковка CMTime
. В этом случае правильный способ извлечения времени -
if let val = params["timestamp"] as? NSValue {
let time = val.timeValue
// ...
}
Смотрите также NSValue(time:)
а также NSValue.timeValue
.