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 eltruncatingRemaindermétodo en su lugar.Float64sino activadoIntúnicamente; por lo tanto:let minutes:Int = Int(totalSeconds) % 3600 / 60; let seconds:Int = Int(totalSeconds) % 60es la forma correcta.Respuestas:
CMTimeGetSeconds()devuelve un número de punto flotante (Float64tambié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:remainderotruncatingRemainder. (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
CMTimeGetSecondsen 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,CMTimeeso puede ser importante. ¿Quiere minutos: segundos: fotogramas, por ejemplo?)Dependiendo de cómo desee presentar los
CMTimevalores en su interfaz de usuario, podría ser mejor extraer el valor de los segundos y pasarloNSDateFormatteroNSDateComponentsFormatterpara 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
totalSecondses unTimeInterval(Double).fuente
totalSeconds = 59.8su código calcula 0 minutos y 0 segundos.roundno 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