Recibo el siguiente error cuando uso el código para una extensión, no estoy seguro de si me están pidiendo simplemente usar un operador diferente o modificar los valores en la expresión según una búsqueda en Internet.
Error:% no está disponible: utilice truncatingRemainder en su lugar
Código de extensión:
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)
}
}
}
Los errores se producen al configurar las variables de minutos y segundos.
%
operador no está disponible y debería considerar usar algo como eltruncatingRemainder
método en su lugar.Float64
sino activadoInt
únicamente; por lo tanto:let minutes:Int = Int(totalSeconds) % 3600 / 60; let seconds:Int = Int(totalSeconds) % 60
es la forma correcta.Respuestas:
CMTimeGetSeconds()
devuelve un número de punto flotante (Float64
también conocido comoDouble
). En Swift 2, podría calcular el resto de una división de punto flotante comoEn Swift 3 esto se hace con
Aplicado a su código:
Sin embargo, en este caso particular, es más fácil convertir la duración a un número entero en primer lugar:
Luego, las siguientes líneas se simplifican a
fuente
El
%
operador de módulo se define solo para tipos enteros. Para los tipos de punto flotante, debe ser más específico sobre el tipo de comportamiento de división / resto IEEE 754 que desea, por lo que debe llamar a un método:remainder
otruncatingRemainder
. (Si está haciendo matemáticas de punto flotante, realmente debe preocuparse por esto y muchas otras cosas , o puede obtener resultados inesperados / malos).Si realmente tiene la intención de hacer un módulo entero, debe convertir el valor de retorno de
CMTimeGetSeconds
en un número entero antes de usarlo%
. (Tenga en cuenta que si lo hace, reducirá las fracciones de segundo ... dependiendo de dónde esté usando,CMTime
eso puede ser importante. ¿Quiere minutos: segundos: fotogramas, por ejemplo?)Dependiendo de cómo desee presentar los
CMTime
valores en su interfaz de usuario, podría ser mejor extraer el valor de los segundos y pasarloNSDateFormatter
oNSDateComponentsFormatter
para obtener el soporte de configuración regional adecuado.fuente
Recupere la sintaxis de módulo simple en swift 3:
Esta sintaxis fue sugerida en la lista de correo rápida oficial de Apples aquí, pero por alguna razón optaron por una sintaxis menos elegante.
Este sencillo consejo de migración de Swift 3 es parte de una guía de migración de Swift 3 más completa con muchos conocimientos (35.000 ubicaciones / 8 días de migración) http://eon.codes/blog/2017/01/12/swift-3-migration /
fuente
remainder(dividingBy:)
ytruncatingRemainder(dividingBy:)
. Es posible que desee leer los documentos de ambos. Además, consulte la misma pregunta para C ++ stackoverflow.com/questions/6102948/…Descubrí que lo siguiente funciona en Swift 3:
donde
totalSeconds
es unTimeInterval
(Double
).fuente
totalSeconds = 59.8
su código calcula 0 minutos y 0 segundos.round
no es necesario en absoluto.No es necesario crear un operador de módulo separado para números de punto flotante, a menos que crea que hace que el código sea más seguro. Puede sobrecargar el
%
operador para aceptar números de punto flotante como este:Uso
Ahora puede usar
%
con dos números de punto flotante del mismo tye.fuente