Получение фатальной ошибки: двойное значение не может быть преобразовано в Int, поскольку оно либо бесконечно, либо NaN

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

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))


person Community    schedule 30.11.2018    source источник


Ответы (2)


Из 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
}
person Gino Mempin    schedule 30.11.2018
comment
Спасибо ... в другом вопросе я нашел это, но я реализовал его не в том месте :) - person ; 30.11.2018

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

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
    }
person Mihir Mehta    schedule 30.11.2018