Saya kenal dengan switch
pernyataan di Swift, tetapi bertanya-tanya bagaimana cara mengganti bagian kode ini dengan switch
:
if someVar < 0 {
// do something
} else if someVar == 0 {
// do something else
} else if someVar > 0 {
// etc
}
swift
switch-statement
Pieter
sumber
sumber
Jawaban:
Inilah satu pendekatan. Dengan asumsi
someVar
adalahInt
atau yang lainComparable
, Anda dapat secara opsional menetapkan operan ke variabel baru. Ini memungkinkan Anda menentukan ruang lingkupnya namun Anda ingin menggunakanwhere
kata kunci:Ini dapat disederhanakan sedikit:
Anda juga dapat menghindari
where
kata kunci sepenuhnya dengan pencocokan rentang:sumber
default: fatalError()
untuk mendeteksi kemungkinan kesalahan logika lebih awal.assertionFailure
tampaknya menjadi pilihan yang lebih aman, terutama saat bekerja dalam tim.Dengan Swift 5, Anda dapat memilih salah satu sakelar berikut untuk mengganti pernyataan if Anda.
# 1 Menggunakan sakelar dengan
PartialRangeFrom
danPartialRangeUpTo
# 2 Menggunakan sakelar dengan
ClosedRange
danRange
# 3 Menggunakan sakelar dengan klausa mana
# 4 Menggunakan switch dengan tempat klausa dan penugasan
_
# 5 Menggunakan sakelar dengan operator
RangeExpression
protokol~=(_:_:)
# 6 Menggunakan sakelar dengan operator
Equatable
protokol~=(_:_:)
# 7 Menggunakan switch dengan
PartialRangeFrom
,PartialRangeUpTo
danRangeExpression
'scontains(_:)
metodesumber
0.1
melempar kesalahan fatal karena1...
hanya mencakup angka dari 1. Jadi solusi ini hanya berfungsi jikavalue
merupakanInt
tetapi itu berbahaya karena jika tipe variabel berubah, fungsionalitas terputus tanpa kesalahan kompiler.The
switch
pernyataan, di bawah tenda, menggunakan~=
operator. Jadi ini:Desugars untuk ini:
Jika Anda melihat referensi pustaka standar, ini dapat memberi tahu Anda dengan tepat apa yang
~=
dilakukan kelebihan beban : disertakan adalah pencocokan rentang, dan menyamakan untuk hal-hal yang setara. (Tidak termasuk adalah pencocokan enum, yang merupakan fitur bahasa, bukan fungsi di std lib)Anda akan melihat bahwa itu tidak cocok dengan boolean lurus di sisi kiri. Untuk perbandingan semacam itu, Anda perlu menambahkan pernyataan where.
Kecuali ... Anda membebani
~=
operator sendiri. (Ini umumnya tidak disarankan) Satu kemungkinan akan menjadi seperti ini:Sehingga cocok dengan fungsi yang mengembalikan boolean di sebelah kiri ke parameternya di sebelah kanan. Inilah jenis hal yang dapat Anda gunakan untuk:
Untuk kasus Anda, Anda mungkin memiliki pernyataan yang terlihat seperti ini:
Tetapi sekarang Anda harus mendefinisikan baru
isNegative
danisPositive
fungsi . Kecuali jika Anda membebani beberapa operator lagi ...Anda dapat membebani operator infiks normal menjadi operator awalan atau postfix. Ini sebuah contoh:
Ini akan bekerja seperti ini:
Gabungkan itu dengan fungsi sebelumnya, dan pernyataan sakelar Anda dapat terlihat seperti ini:
Sekarang, Anda mungkin tidak boleh menggunakan hal semacam ini dalam praktik: itu agak cerdik. Anda (mungkin) lebih baik bertahan dengan
where
pernyataan itu. Yang mengatakan, pola pernyataan beralihatau
Tampaknya cukup umum untuk itu layak dipertimbangkan.
sumber
Kamu bisa:
sumber
Karena seseorang telah memposting di
case let x where x < 0:
sini adalah alternatif untuk di manasomeVar
adalahInt
.Dan di sini ada alternatif untuk di mana
someVar
adalahDouble
:sumber
Beginilah tampilannya dengan rentang
sumber
The
<0
ekspresi tidak bekerja (lagi?) Jadi aku akhirnya dengan ini:Swift 3.0:
sumber
X_MAX
telah digantikan oleh.greatestFiniteMagnitude
, mis .Double.greatestFiniteMagnitude
,CGFloat.greatestFiniteMagnitude
Dll. Jadi biasanya, Anda bisa melakukannyacase 0..< .greatestFiniteMagnitude
karena jenisnyasomeVar
sudah diketahuivar timeLeft = 100
switch timeLeft {case 0...<=7200: print("ok") default:print("nothing") }
Mengapa<=
operator tidak dikenali? Jika saya menulisnya tanpa sama itu berfungsi. Terima kasihcase 0...7200:
Operator<=
adalah operator perbandingan. Dalam sakelar, Anda hanya dapat menggunakan operator jangkauan (lihat dokumen)someVar
adalahInt
dan saya harus melakukanDouble(
beberapaVar) `untuk membuatnya bekerja ...Senang bahwa Swift 4 mengatasi masalah:
Sebagai solusi di 3 saya lakukan:
Bekerja tetapi tidak ideal
sumber