Ich erhalte die folgende Fehlermeldung, wenn ich Code für eine Erweiterung verwende. Ich bin mir nicht sicher, ob sie nur einen anderen Operator verwenden oder die Werte im Ausdruck basierend auf einer Internetsuche ändern möchten.
Fehler:% ist nicht verfügbar: Verwenden Sie stattdessen truncatingRemainder
Erweiterungscode:
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)
}
}
}
Die Fehler treten beim Einstellen der Minuten- und Sekundenvariablen auf.
%
Operator nicht verfügbar ist und SietruncatingRemainder
stattdessen die Methode in Betracht ziehen sollten .Float64
sondernInt
nur. deshalb:let minutes:Int = Int(totalSeconds) % 3600 / 60; let seconds:Int = Int(totalSeconds) % 60
ist der richtige weg.Antworten:
CMTimeGetSeconds()
Gibt eine Gleitkommazahl (Float64
akaDouble
) zurück. In Swift 2 können Sie den Rest einer Gleitkommadivision als berechnenIn Swift 3 ist dies erledigt
Auf Ihren Code angewendet:
In diesem speziellen Fall ist es jedoch zunächst einfacher, die Dauer in eine Ganzzahl umzuwandeln:
Dann vereinfachen sich die nächsten Zeilen zu
quelle
Der
%
Moduloperator ist nur für ganzzahlige Typen definiert. Bei Gleitkommatypen müssen Sie die Art des gewünschten IEEE 754-Teilungs- / Restverhaltens genauer festlegen, sodass Sie eine Methode aufrufen müssen: entwederremainder
odertruncatingRemainder
. (Wenn Sie Gleitkomma-Mathematik machen, müssen Sie sich tatsächlich darum kümmern und viele andere Dinge , sonst können Sie unerwartete / schlechte Ergebnisse erzielen.)Wenn Sie tatsächlich einen Ganzzahlmodul verwenden möchten, müssen Sie den Rückgabewert von
CMTimeGetSeconds
vor der Verwendung in eine Ganzzahl konvertieren%
. (Beachten Sie,CMTime
dass Sie in diesem Fall die Sekundenbruchteile verlieren ... je nachdem, wo Sie sie verwenden , kann dies wichtig sein. Möchten Sie beispielsweise Minuten: Sekunden: Frames?)Je nachdem , wie Sie wollen vorliegenden
CMTime
Werte in Ihrer Benutzeroberfläche, könnte es besser sein , den Sekundenwert zu extrahieren und übergeben es anNSDateFormatter
oderNSDateComponentsFormatter
schauen Sie sich das jeweilige Land Unterstützung erhalten.quelle
Bringen Sie die einfache Modulo-Syntax in Swift 3 zurück:
Diese Syntax wurde tatsächlich auf der offiziellen schnellen Mailingliste von Apples hier vorgeschlagen, aber aus irgendeinem Grund entschieden sie sich für eine weniger elegante Syntax.
Dieser einfache Swift 3-Migrationstipp ist Teil eines umfassenderen Swift 3-Migrationsleitfadens mit vielen Erkenntnissen (35.000 Loc / 8 Tage Migration) http://eon.codes/blog/2017/01/12/swift-3-migration /.
quelle
remainder(dividingBy:)
und.truncatingRemainder(dividingBy:)
Vielleicht möchten Sie die Dokumente für beide lesen. Beziehen SieIch habe festgestellt, dass in Swift 3 Folgendes funktioniert:
wo
totalSeconds
ist einTimeInterval
(Double
).quelle
totalSeconds = 59.8
Ihren Code werden 0 Minuten und 0 Sekunden berechnet.round
nicht benötigt.Es ist nicht erforderlich, einen separaten Modulo-Operator für Gleitkommazahlen zu erstellen, es sei denn, Sie glauben, dass dies den Code sicherer macht. Sie können den
%
Operator überladen , um Gleitkommazahlen wie folgt zu akzeptieren:Verwendung
Sie können jetzt
%
mit zwei beliebigen Gleitkommazahlen desselben Tye verwenden.quelle