Получение фатальной ошибки: двойное значение не может быть преобразовано в Int, потому что оно либо бесконечно, либо NaN - PullRequest
0 голосов
/ 30 ноября 2018

Код для приложения подкастинга.

import AVKit

extension CMTime {
func toDisplayString() -> String {
    let totalSeconds = Int(CMTimeGetSeconds(self))
    let seconds = totalSeconds % 60
    let minutes = totalSeconds / 60
    let timeFormatString = String(format: "%02d:%02d", minutes, seconds)
    return timeFormatString
}
}

Ошибка при выборе подкаста для воспроизведения ... приводит к воспроизведению звука, но приложение останавливается до перезагрузки.

Редактировать: Ошибка возникает в строке let totalSeconds = Int(CMTimeGetSeconds(self))

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Из документации CMTimeGetSeconds :

Если CMTime является недействительным или неопределенным, возвращается NaN.Если CMTime бесконечен, возвращается +/- бесконечность.

Когда CMTimeGetSeconds возвращает NaN или бесконечность, приведение возвращаемого значения к Int приведет к фатальной ошибке, которую вы видите.

Сначала вы можете проверить значение, а затем вернуть какое-то значение по умолчанию, если это неверное число.

func toDisplayString() -> String {
    let rawSeconds = CMTimeGetSeconds(self)
    guard !(rawSeconds.isNaN || rawSeconds.isInfinite) else {
       return "--" // or some other default string
    }
    let totalSeconds = Int(rawSeconds)
    let seconds = totalSeconds % 60
    let minutes = totalSeconds / 60
    let timeFormatString = String(format: "%02d:%02d", minutes, seconds)
    return timeFormatString
}
0 голосов
/ 30 ноября 2018

Код ниже должен работать ... в основном это происходит потому, что значение, возвращаемое CMTimeGetSeconds(self), превышает Int limit.

func toDisplayString() -> String {
        let totalSeconds:TimeInterval = TimeInterval(CMTimeGetSeconds(self))
        let seconds:TimeInterval = totalSeconds.truncatingRemainder(dividingBy: 60)
        let minutes:TimeInterval = totalSeconds / 60
        let timeFormatString = String(format: "%02d:%02d", minutes, seconds)
        return timeFormatString
    }
...