The switch
pernyataan, di bawah tenda, menggunakan ~=
operator. Jadi ini:
let x = 2
switch x {
case 1: print(1)
case 2: print(2)
case 3..<5: print(3..<5)
default: break
}
Desugars untuk ini:
if 1 ~= x { print(1) }
else if 2 ~= x { print(2) }
else if 3..<5 ~= x { print(3..<5) }
else { }
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:
func ~= <T> (lhs: T -> Bool, rhs: T) -> Bool {
return lhs(rhs)
}
Sehingga cocok dengan fungsi yang mengembalikan boolean di sebelah kiri ke parameternya di sebelah kanan. Inilah jenis hal yang dapat Anda gunakan untuk:
func isEven(n: Int) -> Bool { return n % 2 == 0 }
switch 2 {
case isEven: print("Even!")
default: print("Odd!")
}
Untuk kasus Anda, Anda mungkin memiliki pernyataan yang terlihat seperti ini:
switch someVar {
case isNegative: ...
case 0: ...
case isPositive: ...
}
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:
postfix operator < {}
postfix func < <T : Comparable>(lhs: T)(_ rhs: T) -> Bool {
return lhs < rhs
}
Ini akan bekerja seperti ini:
let isGreaterThanFive = 5<
isGreaterThanFive(6) // true
isGreaterThanFive(5) // false
Gabungkan itu dengan fungsi sebelumnya, dan pernyataan sakelar Anda dapat terlihat seperti ini:
switch someVar {
case 0< : print("Bigger than 0")
case 0 : print("0")
default : print("Less than 0")
}
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 beralih
switch x {
case negative:
case 0:
case positive:
}
atau
switch x {
case lessThan(someNumber):
case someNumber:
case greaterThan(someNumber):
}
Tampaknya cukup umum untuk itu layak dipertimbangkan.