Pertama, saya tidak yakin saya benar-benar mengerti apa itu selector. Dari pemahaman saya, itu adalah nama metode, dan Anda dapat menetapkannya ke kelas tipe 'SEL' dan kemudian menjalankan metode seperti respondToSelector untuk melihat apakah penerima mengimplementasikan metode itu. Bisakah seseorang memberikan penjelasan yang lebih baik?
Kedua, untuk poin ini, saya memiliki kode berikut:
NSString *thing = @"Hello, this is Craig";
SEL sel = @selector(lowercaseString:);
NSString *lower = (([thing respondsToSelector:sel]) ? @"YES" : @"NO");
NSLog (@"Responds to lowercaseString: %@", lower);
if ([thing respondsToSelector:sel]) //(lower == @"YES")
NSLog(@"lowercaseString is: %@", [thing lowercaseString]);
Namun, meskipun thing
jelas merupakan jenis NSString, dan harus merespons lowercaseString, saya tidak bisa mendapatkan 'respondsToSelector' bersyarat untuk mengembalikan "YA" ...
objective-c
selector
Craig
sumber
sumber
Jawaban:
Anda harus sangat berhati-hati dengan nama metode. Dalam kasus ini, nama metode hanya "
lowercaseString
", bukan "lowercaseString:
" (perhatikan tidak adanya titik dua). Itulah mengapa AndaNO
dikembalikan, karenaNSString
objek menanggapilowercaseString
pesan tetapi bukanlowercaseString:
pesannya.Bagaimana Anda tahu kapan harus menambahkan titik dua? Anda menambahkan titik dua ke nama pesan jika Anda ingin menambahkan titik dua saat memanggilnya, yang terjadi jika diperlukan satu argumen. Jika dibutuhkan nol argumen (seperti halnya dengan
lowercaseString
), maka tidak ada titik dua. Jika dibutuhkan lebih dari satu argumen, Anda harus menambahkan nama argumen tambahan bersama dengan titik dua, seperti padacompare:options:range:locale:
.Anda juga dapat melihat dokumentasi dan mencatat ada atau tidaknya tanda titik dua.
sumber
Selektor adalah cara yang efisien untuk mereferensikan metode secara langsung dalam kode yang dikompilasi - kompilator adalah yang sebenarnya memberikan nilai ke SEL.
Orang lain telah menutupi bagian kedua dari q Anda, ':' di bagian akhir cocok dengan tanda tangan yang berbeda dari yang Anda cari (dalam hal ini tanda tangan itu tidak ada).
sumber
Itu karena kamu mau
@selector(lowercaseString)
, bukan@selector(lowercaseString:)
. Ada perbedaan halus: yang kedua menyiratkan parameter (perhatikan titik dua di akhir), tetapi- [NSString lowercaseString]
tidak mengambil parameter.sumber
Dalam kasus ini, nama pemilih salah. Titik dua di sini adalah bagian dari tanda tangan metode; itu berarti bahwa metode tersebut membutuhkan satu argumen. Saya percaya yang Anda inginkan
sumber
Metode NSString adalah
lowercaseString
(0 argumen), bukanlowercaseString:
(1 argumen).sumber
Jangan anggap titik dua sebagai bagian dari nama fungsi, anggap saja sebagai pemisah, jika Anda tidak memiliki apa pun untuk dipisahkan (tidak ada nilai yang sesuai dengan fungsi) maka Anda tidak membutuhkannya.
Saya tidak yakin mengapa tetapi semua hal OO ini tampaknya asing bagi pengembang Apple. Saya sangat menyarankan untuk menggunakan Visual Studio Express dan bermain-main dengannya juga. Bukan karena yang satu lebih baik dari yang lain, hanya itu cara yang baik untuk melihat masalah desain dan cara berpikir.
Suka
Itu selalu bagus untuk melihat masalah dengan cara yang berbeda dan pemrograman adalah teka-teki pamungkas.
sumber
Dari pemahaman saya tentang dokumentasi Apple, pemilih mewakili nama metode yang ingin Anda panggil. Hal yang menyenangkan tentang penyeleksi adalah Anda dapat menggunakannya dalam kasus di mana metode yang tepat untuk dipanggil bervariasi. Sebagai contoh sederhana, Anda dapat melakukan sesuatu seperti:
sumber
Sesuai dokumen apple: https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/Selector.html
Contoh: (lldb) breakpoint --set selector viewDidLoad
Ini akan menyetel breakpoint pada semua implementasi viewDidLoad di aplikasi Anda. Jadi selector adalah semacam pengenal global untuk sebuah metode.
sumber