Apakah ada cara yang lebih cerdas untuk menulis ulang ini?
if ([cardName isEqualToString:@"Six"]) {
[self setValue:6];
} else if ([cardName isEqualToString:@"Seven"]) {
[self setValue:7];
} else if ([cardName isEqualToString:@"Eight"]) {
[self setValue:8];
} else if ([cardName isEqualToString:@"Nine"]) {
[self setValue:9];
}
objective-c
switch-statement
James Raitsev
sumber
sumber
Jawaban:
Sayangnya mereka tidak bisa. Ini adalah salah satu yang terbaik dan pemanfaatan yang paling dicari dari pernyataan switch, jadi semoga mereka naik kereta musik (sekarang) Java (dan lainnya)!
Jika Anda melakukan nama kartu, mungkin menetapkan setiap objek kartu nilai integer dan aktifkan itu. Atau mungkin enum, yang dianggap sebagai angka dan karenanya dapat diaktifkan.
misalnya
Dilakukan dengan cara ini, Ace akan sama dengan case 0, Two sebagai case 1, dll.
sumber
CardType
tidak bisa sama dengan yang terlampir@""
misalnya:[CardType isEqualToString:@"Three"]
Anda dapat mengatur kamus blok, seperti ini:
Untuk memiliki bagian 'default', ganti baris terakhir dengan:
Semoga Apple akan mengajarkan 'berganti' beberapa trik baru.
sumber
Bagi saya, cara mudah yang menyenangkan:
sumber
Sayangnya, pernyataan peralihan hanya bisa digunakan pada tipe primitif. Anda memiliki beberapa opsi menggunakan koleksi.
Mungkin opsi terbaik adalah menyimpan setiap nilai sebagai entri dalam NSDictionary.
sumber
Agak terlambat tetapi bagi siapa pun di masa depan saya bisa membuat ini bekerja untuk saya
sumber
Inilah cara yang lebih cerdas untuk menulis itu. Ini untuk menggunakan
NSNumberFormatter
dalam "mantra-out gaya" :Perhatikan bahwa pemformat angka ingin string lebih kecil, jadi kita harus melakukannya sendiri sebelum meneruskannya ke pemformat.
sumber
Ada cara lain untuk melakukan itu, tetapi
switch
bukan salah satunya.Jika Anda hanya memiliki beberapa string, seperti dalam contoh Anda, kode yang Anda miliki baik-baik saja. Jika Anda memiliki banyak case, Anda bisa menyimpan string sebagai kunci dalam kamus dan mencari nilai yang sesuai:
sumber
OLEH JAUH .. FAVORIT saya "Add-On" ObjC adalah
ObjectMatcher
DAN itu bekerja dengan non-string, TERLALU ... dalam loop, bahkan!
Terbaik dari semua, ada beberapa
{...}
,:
's, dan()
' ssumber
Objective-c tidak berbeda dengan c dalam aspek ini, ia hanya dapat mengaktifkan apa yang dapat c (dan preproc def seperti NSInteger, NSUInteger, karena mereka pada akhirnya hanya diketikkan ke tipe integral).
Wikipedia:
c sintaks :
Jenis Integral :
sumber
Saya agak terlambat ke pesta, tetapi untuk menjawab pertanyaan sebagaimana dinyatakan , ada cara yang lebih cerdas:
Catatan yang
indexOfObject
akan mencari pertandingan menggunakanisEqual:
, persis seperti dalam pertanyaan.sumber
Membangun ide @Graham Perks yang diposting sebelumnya, merancang kelas sederhana untuk membuat pergantian string cukup sederhana dan bersih.
Anda akan menggunakannya seperti ini:
Blok yang benar akan dieksekusi sesuai dengan string.
Inti dari solusi ini
sumber
Saya tidak dapat mengomentari jawaban cris pada jawaban @ Chris tetapi saya ingin mengatakan bahwa:
Ada BATASAN untuk metode @ cris:
typedef enum tidak akan mengambil nilai alfanumerik
Jadi di sini adalah Satu lagi:
Tautan Stack over flow Buka jawaban pengguna ini "user1717750"
sumber
Nikmati Pengodean .....
sumber