Swift 4.2, если let не работает с CMTime на Xcode 11.2 - PullRequest
0 голосов
/ 02 ноября 2019

Начиная с обновления до 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 из словаря params?

  1. Что неожиданно изменилось при сборке с Xcode 11.2?

  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 Ответ

1 голос
/ 02 ноября 2019

Очевидно, что время сохраняется в словаре как NSValue, упаковывающее CMTime. В этом случае правильный способ извлечения времени:

if let val = params["timestamp"] as? NSValue {
    let time = val.timeValue
    // ...
}

См. Также NSValue(time:) и NSValue.timeValue.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...