Saya mendapatkan kesalahan berikut saat menggunakan kode untuk ekstensi, saya tidak yakin apakah mereka meminta untuk hanya menggunakan operator yang berbeda atau mengubah nilai dalam ekspresi berdasarkan pencarian internet.
Kesalahan:% tidak tersedia: Gunakan truncatingRemainder sebagai gantinya
Kode ekstensi:
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)
}
}
}
Kesalahan terjadi saat mengatur variabel menit dan detik.
%
operator tidak tersedia dan Anda harus mempertimbangkan untuk menggunakan sesuatu sepertitruncatingRemainder
metode ini.Float64
tetapiInt
hanya; oleh karena itu:let minutes:Int = Int(totalSeconds) % 3600 / 60; let seconds:Int = Int(totalSeconds) % 60
adalah cara yang benar.Jawaban:
CMTimeGetSeconds()
mengembalikan angka floating point (Float64
aliasDouble
). Di Swift 2 Anda dapat menghitung sisa pembagian floating point sebagaiDi Swift 3 hal ini dilakukan dengan
Diterapkan ke kode Anda:
Namun, dalam kasus khusus ini, lebih mudah untuk mengonversi durasi ke integer terlebih dahulu:
Kemudian baris berikutnya disederhanakan menjadi
sumber
The
%
Operator modulus didefinisikan hanya untuk tipe integer. Untuk tipe floating-point, Anda harus lebih spesifik tentang jenis perilaku pembagian / sisa IEEE 754 yang Anda inginkan, jadi Anda harus memanggil metode: salah saturemainder
atautruncatingRemainder
. (Jika Anda melakukan matematika floating-point, Anda benar-benar perlu peduli tentang ini, dan banyak hal lainnya , atau Anda bisa mendapatkan hasil yang tidak terduga / buruk.)Jika Anda benar-benar bermaksud untuk melakukan modulus integer, Anda perlu mengonversi nilai pengembalian
CMTimeGetSeconds
menjadi integer sebelum menggunakan%
. (Perhatikan bahwa jika Anda melakukannya, Anda akan memotong detik pecahan ... tergantung di mana Anda menggunakanCMTime
yang mungkin penting. Apakah Anda ingin menit: detik: bingkai, misalnya?)Bergantung pada bagaimana Anda ingin menyajikan
CMTime
nilai di UI Anda, mungkin lebih baik mengekstrak nilai detik dan meneruskannya keNSDateFormatter
atauNSDateComponentsFormatter
agar Anda mendapatkan dukungan lokal yang sesuai.sumber
Kembalikan sintaks modulo sederhana dengan cepat 3:
Sintaks ini sebenarnya disarankan di milis Swift resmi Apple di sini, tetapi karena alasan tertentu mereka memilih sintaks yang kurang elegan.
Tip migrasi cepat 3 sederhana ini adalah bagian dari panduan migrasi cepat 3 yang lebih komprehensif dengan banyak wawasan (35k loc / 8-hari migrasi) http://eon.codes/blog/2017/01/12/swift-3-migration /
sumber
remainder(dividingBy:)
dantruncatingRemainder(dividingBy:)
. Anda mungkin ingin membaca dokumen untuk keduanya. Juga, lihat pertanyaan yang sama untuk C ++ stackoverflow.com/questions/6102948/…Saya menemukan bahwa berikut ini berfungsi di Swift 3:
di mana
totalSeconds
aTimeInterval
(Double
).sumber
totalSeconds = 59.8
kode Anda menghitung 0 menit dan 0 detik.round
tidak dibutuhkan sama sekali.Tidak perlu membuat operator modulo terpisah untuk bilangan floating point, kecuali menurut Anda itu membuat kode lebih aman. Anda dapat membebani
%
operator untuk menerima angka floating point seperti ini:Pemakaian
Sekarang Anda dapat menggunakan
%
dengan dua bilangan floating point dari tye yang sama.sumber