Sintaksis metode dalam Objective-C

176

Dapatkah seseorang menjelaskan sintaks deklarasi metode ini untuk saya? Dalam fungsi ini, jumlah baris UIPickerView (UI mesin slot pada iPhone) sedang dikembalikan. Dari pemahaman saya, Metode ini disebut ' pickerView', dan mengembalikan NSInteger.

Ini melewati sebuah pointer ke UIPickerview yang disebut ' pickerView' ... pertama, mengapa metode ini disebut nama yang sama dengan parameter?

Berikutnya ada parameter NSInteger yang disebut komponen yang memberitahu kita komponen mana yang kita hitung untuk baris. Logika untuk memutuskan mana yang ada dalam tubuh metode.

Apa itu numberOfRowsInComponent? Tampaknya menggambarkan nilai yang kami kembalikan, tetapi berada di tengah-tengah parameter.

- (NSInteger) pickerView:(UIPickerView *)pickerView 
 numberOfRowsInComponent:(NSInteger)component
{
    if (component == kStateComponent)
        return [self.states count];

    return[self.zips count];
}
Craig
sumber

Jawaban:

358

Metode Objective-C dirancang untuk menjadi dokumentasi sendiri, dan mereka meminjam dari tradisi Smalltalk yang kaya.

Saya akan mencoba menjelaskan apa yang Anda miliki di sini -(NSInteger) pickerView:(UIPickerView*)pickerView numberOfRowsInComponent:(NSInteger)component,.

  • - (NSInteger)
    Bagian pertama ini menunjukkan bahwa ini adalah metode instance Objective C yang mengembalikan objek NSInteger. yang -(dash) menunjukkan bahwa ini adalah contoh metode, di mana +akan menunjukkan bahwa ini adalah kelas metode. Nilai pertama dalam tanda kurung adalah jenis pengembalian metode.

  • pickerView:
    Bagian ini adalah bagian dari nama pesan . Nama pesan lengkap dalam kasus ini adalah pickerView:numberOfRowsInComponent:. Runtime Objective-C mengambil informasi metode ini dan mengirimkannya ke penerima yang ditunjukkan. Dalam C murni, ini akan terlihat seperti
    NSInteger pickerView(UIPickerView* pickerView, NSInteger component). Namun, karena ini Objective-C, informasi tambahan dikemas ke dalam nama pesan.

  • (UIPickerView*)pickerView
    Bagian ini merupakan bagian dari input . Input di sini adalah tipe UIPickerView*dan memiliki nama variabel lokal pickerView.

  • numberOfRowsInComponent:
    Bagian ini adalah bagian kedua dari nama pesan . Seperti yang dapat Anda lihat di sini, nama pesan dibagi untuk membantu menunjukkan informasi apa yang Anda sampaikan kepada penerima. Jadi, jika saya harus pesan sebuah myObject objek dengan variabel foo dan bar, saya akan ketik:
    [myObject pickerView:foo numberOfRowsInComponent:bar];
    sebagai lawan C ++ gaya:
    myObject.pickerView(foo, bar);.

  • (NSInteger)component
    Ini adalah bagian terakhir dari input . input di sini adalah tipe NSIntegerdan memiliki nama variabel lokal komponen.

locriani
sumber
18
+1 untuk jawaban yang bagus. Saya akan menyarankan mengubah "pabrik" menjadi "kelas" di poin pertama Anda, karena "+" secara resmi menunjukkan metode kelas. Kebetulan banyak metode "+" adalah metode pabrik, tapi itu bukan definisi yang tepat.
e.James
2
Terima kasih! Satu pertanyaan tambahan: Jika Anda mengirim pesan ke objek myObject dengan variabel foo dan bar seperti yang Anda tunjukkan: [myObject pickerView: foo numberOfRowsInComponent: bar]; Apakah pickerView merujuk pada nama metode atau parameter?
Craig
2
Tidak juga. Ini adalah gaya yang baik untuk merujuk ke nama metode DAN parameter, tetapi nama metode lengkap sebenarnya adalah pickerView: numberOfRowsInComponent :. Jika Anda mencoba memanggil pickerView :, Anda akan menerima kesalahan runtime, karena metode ini tidak ada.
locriani
1
Biarkan saya mengklarifikasi bahwa: bagian pickerView: dengan sendirinya HARUS merujuk pada parameter berikut, untuk mengikuti gaya pengkodean yang baik. Namun, hanya 1/2 dari nama metode. Contoh yang lebih baik adalah [myObject setX: foo Y: bar], di mana metode ini setX: Y :.
locriani
1
Saya tahu jawaban ini sudah lama, tapi saya sudah tinggal di dunia .NET selama beberapa tahun terakhir. Saya baru mengenal Objective C, dan beralih dari dunia web ke industri seluler. Saya ingin mengucapkan terima kasih atas penjelasan yang didokumentasikan dengan baik yang sangat relevan dengan pertanyaan. +1
d3v1lman1337
52

Dalam Objective-C, nama metode terdiri dari semua bagian dari deklarasi yang bukan argumen dan tipe. Karena itu nama metode ini adalah:

pickerView:numberOfRowsInComponent:

Metode ini akan setara dengan fungsi gaya-C yang tampak sebagai berikut:

sunting: (dengan terima kasih kepada Jarret Hardie ):

NSInteger pickerViewNumberOfRowsInComponent(UIPickerView * pickerView, NSInteger component)
e.James
sumber
1
+1 - deskripsi singkat yang bagus. Kadang-kadang saya menemukan bola lampu menyala untuk orang-orang jika Anda menulis setara dengan C-style sebagai "NSInteger pickerViewNumberOfRowsInCompoent (UIPickerView * pickerView, komponen NSInteger)
Jarret Hardie
Saya suka penjelasan Anda, menulis ulang dalam C jauh lebih baik.
lcc
30

Menambahkan ke jawaban sebelumnya, saya hanya ingin mengatakan bahwa metode Objective-C (atau pesan jika Anda suka) memiliki nama parameter eksternal dan internal .

Jadi dalam hal ini:

- (NSInteger) pickerView:(UIPickerView *)pickerView 
 numberOfRowsInComponent:(NSInteger)component

numberOfRowsInComponentadalah nama eksternal , yang akan Anda gunakan saat memanggil metode ini dari luar.

Dan componentadalah nama internal parameter, yang Anda gunakan untuk merujuk ke parameter dari dalam metode.

Semoga itu sedikit membersihkannya.

Karolis
sumber
1
Sesuai dengan deskripsi Anda, nama metode dapat dianggap sebagai nama eksternal dari parameter pertama. Ini juga cocok dengan komentar wilczarz di bawah.
Jake
Sial, saya menemukan jawaban ini sangat salah. Tidak ada yang namanya nama parameter eksternal / internal. Ini adalah TYPE dan pengidentifikasi VARIABEL. Saya bertanya-tanya mengapa semua orang berusaha sangat keras untuk mendefinisikan ObjC sebagai bahasa alami, sangat tidak wajar dalam semua caranya. Itu bahasa, itu saja, mari kita mempelajarinya tanpa menggunakan kata-kata mewah di sekitarnya.
Siddharth
Argumen dapat memiliki nama internal / eksternal. Itu benar.
lcc
21

Tampaknya bagi saya bahwa tanda tangan metode Objective-C lebih seperti kalimat. Setiap parameter layak mendapat bagian dalam nama metode. Sebagai contoh, di C kita dapat memiliki metode ( setPersonData ) untuk mengatur beberapa informasi tentang orang:

void setPersonData( char* name, int age, float height ) {

dan di Objective-C metode akan lebih deskriptif ( setPersonName: andAge: andHeight:) , seperti

- (void) setPersonName: (char *)name andAge:(int)age andHeight:(float)height {
wilczarz
sumber
8
Dan mengapa setPersonalData (char * andName, int alsoAge, float alsoHeight) tidak masuk akal? Ini semua tentang apa yang Anda mengerti tentang sintaks, tidak ada tentang maksud desainer objek menjadi cerdas di sini. mereka hanya menambahkan banyak sintaks yang terus terang tidak masuk akal .. :)
Siddharth
5
Aku salah paham jawabannya, aku takut. setPersonalData (char * andName, int alsoAge, float alsoHeight) adalah tanda tangan, bukan doa. Doa dari fungsi ini adalah setPersonData ("Tom", 25, 175) - dan itu tidak mengatakan apa-apa? Doa Obj-C akan terlihat seperti ini: [person setPersonName: @ "Tom" andAge: 25 andHeight: 175];
wilczarz
3
Sekarang saya berpikir tentang hal itu, tanggapan saya lebih merupakan keluhan daripada pernyataan. Saya sangat setuju.
Siddharth