Podczas używania kodu rozszerzenia pojawia się następujący błąd: nie jestem pewien, czy proszą o użycie innego operatora lub zmodyfikowanie wartości w wyrażeniu na podstawie wyszukiwania w Internecie.
Błąd:% jest niedostępny: zamiast tego użyj truncatingRemainder
Kod rozszerzenia:
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)
}
}
}
Błędy występują podczas ustawiania zmiennych minut i sekund.
%
operator jest niedostępny i powinieneśtruncatingRemainder
zamiast tego rozważyć użycie czegoś podobnego do metody.Float64
aleInt
tylko na; dlatego:let minutes:Int = Int(totalSeconds) % 3600 / 60; let seconds:Int = Int(totalSeconds) % 60
jest właściwą drogą.BinaryInteger
, a nie tylkoInt
.Odpowiedzi:
CMTimeGetSeconds()
zwraca liczbę zmiennoprzecinkową (Float64
akaDouble
). W Swift 2 można obliczyć pozostałą część dzielenia zmiennoprzecinkowego jakoW Swift 3 odbywa się to za pomocą
Zastosowano do twojego kodu:
Jednak w tym konkretnym przypadku łatwiej jest najpierw przekonwertować czas trwania na liczbę całkowitą:
Następnie następne wiersze upraszczają się do
źródło
%
Operatora moduł jest określony tylko przez liczby całkowite. W przypadku typów zmiennoprzecinkowych musisz bardziej szczegółowo określić rodzaj zachowania podziału / reszty IEEE 754, który chcesz, więc musisz wywołać metodę: alboremainder
lubtruncatingRemainder
. (Jeśli wykonujesz obliczenia zmiennoprzecinkowe, musisz się tym zająć i wieloma innymi rzeczami , inaczej możesz uzyskać nieoczekiwane / złe wyniki).Jeśli faktycznie zamierzasz uzyskać moduł
CMTimeGetSeconds
całkowity, przed użyciem musisz przekonwertować zwracaną wartość na liczbę całkowitą%
. (Pamiętaj, że jeśli to zrobisz, odetniesz ułamkowe części sekund ... w zależności od tego, gdzie używaszCMTime
, może to być ważne. Czy chcesz na przykład minuty: sekundy: klatki?)W zależności od tego, jak chcesz prezentować
CMTime
wartości w swoim interfejsie użytkownika, może być lepiej wyodrębnić wartość sekund i przekazać jąNSDateFormatter
lubNSDateComponentsFormatter
tak, aby uzyskać odpowiednią obsługę ustawień regionalnych.źródło
Przywróć prostą składnię modulo w Swift 3:
Ta składnia została faktycznie zasugerowana na oficjalnej, szybkiej liście mailingowej Apples , ale z jakiegoś powodu zdecydowali się na mniej elegancką składnię.
Ta prosta wskazówka dotycząca migracji Swift 3 jest częścią bardziej kompleksowego przewodnika migracji Swift 3 z wieloma spostrzeżeniami (35 tys. Loc / 8 dni migracji) http://eon.codes/blog/2017/01/12/swift-3-migration /
źródło
remainder(dividingBy:)
i .MożesztruncatingRemainder(dividingBy:)
chcieć przeczytać dokumenty dla obu. Odnieś się również do tego samego pytania w C ++ stackoverflow.com/questions/6102948/ ...Odkryłem, że w Swift 3 działa:
gdzie
totalSeconds
jestTimeInterval
(Double
).źródło
totalSeconds = 59.8
Twój kod oblicza 0 minut i 0 sekund.round
nie jest potrzebne.Nie ma potrzeby tworzenia oddzielnego operatora modulo dla liczb zmiennoprzecinkowych, chyba że uważasz, że czyni to kod bezpieczniejszym. Możesz przeciążać
%
operatora, aby akceptował liczby zmiennoprzecinkowe, na przykład:Stosowanie
Możesz teraz używać
%
dowolnych dwóch liczb zmiennoprzecinkowych tego samego typu.źródło