При использовании кода для расширения я получаю следующую ошибку: я не уверен, просят ли они просто использовать другой оператор или изменить значения в выражении на основе поиска в Интернете.
Ошибка:% недоступен: используйте truncatingRemainder вместо
Код расширения:
extension CMTime {
var durationText:String {
let totalSeconds = CMTimeGetSeconds(self)
let hours:Int = Int(totalSeconds / 3600)
let minutes:Int = Int(totalSeconds % 3600 / 60)
let seconds:Int = Int(totalSeconds % 60)
if hours > 0 {
return String(format: "%i:%02i:%02i", hours, minutes, seconds)
} else {
return String(format: "%02i:%02i", minutes, seconds)
}
}
}
Ошибка (и) возникает при установке переменных минут и секунд.
%
оператор недоступен, и вам следует подумать об использовании чего-то вроде этогоtruncatingRemainder
метода.Float64
только onInt
; следовательно:let minutes:Int = Int(totalSeconds) % 3600 / 60; let seconds:Int = Int(totalSeconds) % 60
это правильный путь.BinaryInteger
, а не толькоInt
.Ответы:
CMTimeGetSeconds()
возвращает число с плавающей запятой (такжеFloat64
известное какDouble
). В Swift 2 вы можете вычислить остаток от деления с плавающей запятой какВ Swift 3 это делается с помощью
Применяется к вашему коду:
Однако в этом конкретном случае проще преобразовать длительность в целое число:
Затем следующие строки упрощаются до
источник
Оператор
%
модуля определен только для целочисленных типов. Для типов с плавающей запятой вам нужно быть более конкретным в отношении типа поведения деления / остатка IEEE 754, которое вы хотите, поэтому вам нужно вызвать метод: либо,remainder
либоtruncatingRemainder
. (Если вы занимаетесь математикой с плавающей запятой, вам действительно нужно позаботиться об этом и многих других вещах , иначе вы можете получить неожиданные / плохие результаты.)Если вы действительно собираетесь использовать целочисленный модуль, вам необходимо преобразовать возвращаемое значение
CMTimeGetSeconds
в целое число перед использованием%
. (Обратите внимание, что если вы это сделаете, вы отрежете доли секунды ... в зависимости от того, где вы используете,CMTime
это может быть важно. Вы хотите, например, минуты: секунды: кадры?)В зависимости от того, как вы хотите представить
CMTime
значения в своем пользовательском интерфейсе, может быть лучше извлечь значение секунд и передать егоNSDateFormatter
илиNSDateComponentsFormatter
так, чтобы вы получили соответствующую поддержку локали.источник
Верните простой синтаксис по модулю в Swift 3:
Этот синтаксис фактически предложил на яблоки официальный стремительной список рассылки здесь , но по какой - то причине они выбрали менее элегантного синтаксиса.
Этот простой совет по миграции на Swift 3 является частью более подробного руководства по миграции на Swift 3 со множеством идей (35 тыс. Локальных / 8 дней миграции) http://eon.codes/blog/2017/01/12/swift-3-migration /
источник
remainder(dividingBy:)
иtruncatingRemainder(dividingBy:)
. Возможно, вы захотите прочитать документацию для обоих. Также обратитесь к тому же вопросу для C ++ stackoverflow.com/questions/6102948/…Я обнаружил, что в Swift 3 работает следующее:
где
totalSeconds
aTimeInterval
(Double
).источник
totalSeconds = 59.8
вашего кода вычисляется 0 минут и 0 секунд.round
вообще не нужно.Нет необходимости создавать отдельный оператор по модулю для чисел с плавающей запятой, если вы не думаете, что это делает код более безопасным. Вы можете перегрузить
%
оператор, чтобы он принимал числа с плавающей запятой, например:использование
Теперь вы можете использовать
%
с любыми двумя числами с плавающей запятой одного и того же типа.источник