J'obtiens l'erreur suivante lors de l'utilisation du code pour une extension, je ne suis pas sûr s'ils demandent simplement d'utiliser un opérateur différent ou de modifier les valeurs dans l'expression en fonction d'une recherche sur Internet.
Erreur:% n'est pas disponible: utilisez plutôt truncatingRemainder
Code d'extension:
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)
}
}
}
Les erreurs se produisent lors de la définition des variables des minutes et des secondes.
%
opérateur n'est pas disponible et que vous devriez envisager d'utiliser quelque chose comme latruncatingRemainder
méthode à la place.Float64
maisInt
uniquement sur ; donc:let minutes:Int = Int(totalSeconds) % 3600 / 60; let seconds:Int = Int(totalSeconds) % 60
est la bonne manière.Réponses:
CMTimeGetSeconds()
renvoie un nombre à virgule flottante (Float64
akaDouble
). Dans Swift 2, vous pouvez calculer le reste d'une division en virgule flottante commeDans Swift 3, cela se fait avec
Appliqué à votre code:
Cependant, dans ce cas particulier, il est plus facile de convertir la durée en un entier en premier lieu:
Ensuite, les lignes suivantes se simplifient en
la source
L'
%
opérateur de module est défini uniquement pour les types entiers. Pour les types à virgule flottante, vous devez être plus précis sur le type de comportement de division / reste IEEE 754 souhaité, vous devez donc appeler une méthode: soitremainder
outruncatingRemainder
. (Si vous faites des calculs en virgule flottante, vous devez en fait vous soucier de cela, et de beaucoup d'autres choses , ou vous pouvez obtenir des résultats inattendus / mauvais.)Si vous avez réellement l'intention de faire un module entier, vous devez convertir la valeur de retour de
CMTimeGetSeconds
en entier avant d'utiliser%
. (Notez que si vous le faites, vous réduirez les fractions de seconde ... selon l'endroit où vous l'utilisez,CMTime
cela peut être important. Voulez-vous minutes: secondes: images, par exemple?)En fonction de la façon dont vous souhaitez présenter les
CMTime
valeurs dans votre interface utilisateur, il peut être préférable d'extraire la valeur des secondes et de la transmettre àNSDateFormatter
ouNSDateComponentsFormatter
afin d'obtenir la prise en charge des paramètres régionaux appropriés.la source
Ramenez la syntaxe modulo simple dans swift 3:
Cette syntaxe a en fait été suggérée sur la liste de diffusion officielle d'Apple ici, mais pour une raison quelconque, ils ont opté pour une syntaxe moins élégante.
Cette astuce de migration swift 3 simple fait partie d'un guide de migration swift 3 plus complet avec de nombreuses informations (35k loc / 8 jours de migration) http://eon.codes/blog/2017/01/12/swift-3-migration /
la source
remainder(dividingBy:)
et.truncatingRemainder(dividingBy:)
Vous voudrez peut-être lire la documentation pour les deux. Aussi, reportez-vous à la même question pour C ++ stackoverflow.com/questions/6102948/…J'ai trouvé que ce qui suit fonctionne dans Swift 3:
où
totalSeconds
est unTimeInterval
(Double
).la source
totalSeconds = 59.8
votre code calcule 0 minute et 0 seconde.round
n'est pas du tout nécessaire.Il n'est pas nécessaire de créer un opérateur modulo séparé pour les nombres à virgule flottante, sauf si vous pensez que cela rend le code plus sûr. Vous pouvez surcharger l'
%
opérateur pour accepter les nombres à virgule flottante comme ceci:Usage
Vous pouvez maintenant utiliser
%
avec deux nombres à virgule flottante du même tye.la source