Что означает "% недоступен: вместо этого используйте truncatingRemainder"?
Я получаю следующую ошибку при использовании кода для расширения, я не уверен, просят ли они просто использовать другой оператор или изменить значения в выражении на основе поиска в интернете.
ошибка: % недоступен: используйте 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)
}
}
}
ошибки возникают при установке переменных минут и секунд.
4 ответа:
CMTimeGetSeconds()
возвращает число с плавающей точкой (Float64
акаDouble
). В Swift 2 Вы можете вычислить остаток от деления с плавающей запятой какlet rem = 2.5 % 1.1 print(rem) // 0.3
в Swift 3 это делается с помощью
let rem = 2.5.truncatingRemainder(dividingBy: 1.1) print(rem) // 0.3
применить к код:
let totalSeconds = CMTimeGetSeconds(self) let hours = Int(totalSeconds / 3600) let minutes = Int((totalSeconds.truncatingRemainder(dividingBy: 3600)) / 60) let seconds = Int(totalSeconds.truncatingRemainder(dividingBy: 60))
однако в этом конкретном случае легче преобразовать длительность к целому числу в первую очередь:
let totalSeconds = Int(CMTimeGetSeconds(self)) // Truncate to integer // Or: let totalSeconds = lrint(CMTimeGetSeconds(self)) // Round to nearest integer
затем следующие строки упрощаются до
let hours = totalSeconds / 3600 let minutes = (totalSeconds % 3600) / 60 let seconds = totalSeconds % 60
The
%
оператор модуля определены только для целочисленных типов. Для типов с плавающей запятой вам нужно быть более конкретным в отношении типа поведения IEEE 754 division / remain, поэтому вам нужно вызвать метод: либоremainder
илиtruncatingRemainder
. (Если вы занимаетесь математикой с плавающей запятой, вам действительно нужно заботиться об этом, и много других вещей, или вы можете получить неожиданные и плохие результаты.)если вы действительно намерены делать целочисленный модуль, необходимо преобразовать возвращаемое значение
CMTimeGetSeconds
к целому числу перед использованием%
. (Обратите внимание, что если вы это сделаете, вы отрежете доли секунды... в зависимости от того, где вы используетеCMTime
это может быть важно. Вам нужны минуты: секунды: кадры, например?)в зависимости от того, как вы хотите представить
CMTime
значения в вашем пользовательском интерфейсе, возможно, лучше извлечь значение секунд и передать его вNSDateFormatter
илиNSDateComponentsFormatter
так что вы получите соответствующая поддержка локали.
верните простой синтаксис по модулю в swift 3:
этот синтаксис был фактически предложен в официальном списке рассылки Apple swift здесь но по какой-то причине они выбрали менее элегантный синтаксис.
infix operator %%/*<--infix operator is required for custom infix char combos*/ /** * Brings back simple modulo syntax (was removed in swift 3) * Calculates the remainder of expression1 divided by expression2 * The sign of the modulo result matches the sign of the dividend (the first number). For example, -4 % 3 and -4 % -3 both evaluate to -1 * EXAMPLE: * print(12 %% 5) // 2 * print(4.3 %% 2.1) // 0.0999999999999996 * print(4 %% 4) // 0 * NOTE: The first print returns 2, rather than 12/5 or 2.4, because the modulo (%) operator returns only the remainder. The second trace returns 0.0999999999999996 instead of the expected 0.1 because of the limitations of floating-point accuracy in binary computing. * NOTE: Int's can still use single % * NOTE: there is also .remainder which supports returning negatives as oppose to truncatingRemainder (aka the old %) which returns only positive. */ public func %% (left:CGFloat, right:CGFloat) -> CGFloat { return left.truncatingRemainder(dividingBy: right) }
этот простой совет по миграции swift 3 является частью более полного руководства по миграции swift 3 со многими идеями (35k loc / 8-days of migration) http://eon.коды / блог/2017/01/12/swift-3-миграция/