Bagaimana cara melewati beberapa parameter di Objective-C?

178

Saya telah membaca beberapa posting tentang sintaks metode Objective-C tapi saya kira saya tidak mengerti banyak nama untuk suatu metode.

Saya mencoba membuat metode yang disebut getBusStopsdengan NSStringdan NSTimeIntervalparameter serta tipe pengembalian NSMutableArray. Ini adalah bagaimana saya telah membangun metode tetapi jelas mendapatkan kesalahan saat runtime:

- (NSMutableArray *)getBusStops:(NSString *)busStop
                                (NSTimeInterval *)timeInterval;

Saya melihat contoh lain dengan metode:

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

Saya tidak mengerti mengapa metode ini memiliki nama metode untuk setiap parameter. Haruskah saya melakukan hal yang sama dengan sesuatu seperti:

- (NSMutableArray *)getBusStops:(NSString *)busStop
                        forTime:(NSTimeInterval *)timeInterval
Atma
sumber

Jawaban:

120

Objective-C tidak memiliki nama parameter, jadi semua yang ada di sisi kiri titik dua adalah bagian dari nama metode. Sebagai contoh,

getBusStops: forTime:

adalah nama metodenya. Nama ini dipecah sehingga bisa lebih deskriptif. Anda cukup memberi nama metode Anda

getBusStops: :

tapi itu tidak banyak memberi tahu Anda tentang parameter kedua.

Terry Wilcox
sumber
157

Anda harus membatasi setiap nama parameter dengan tanda ":" paling tidak. Secara teknis nama itu opsional, tetapi disarankan agar mudah dibaca. Jadi Anda bisa menulis:

- (NSMutableArray*)getBusStops:(NSString*)busStop :(NSSTimeInterval*)timeInterval;

atau apa yang Anda sarankan:

- (NSMutableArray*)getBusStops:(NSString*)busStop forTime:(NSSTimeInterval*)timeInterval;
EM
sumber
15
+1: Argumen fungsi Objective-C memang posisional, tidak dinamai, sehingga label opsional dan untuk konsumsi manusia.
Jarret Hardie
tidak yakin mengapa "forTime" lebih disukai di tanda tangan, "timeInterval" dapat digunakan sebagai parameter ke-2 dalam fungsi, kan?
galactica
@galactica - Tentu, namanya bisa menjadi apa pun yang paling masuk akal bagi Anda. Contoh ini menggunakan terminologi OP untuk konsistensi.
EM
2
Masih tidak yakin forTimedigunakan untuk apa?
mrgloom
71

Iya; sintaks metode Objective-C seperti ini karena beberapa alasan; salah satunya adalah agar jelas parameter apa yang Anda tentukan. Misalnya, jika Anda menambahkan objek ke NSMutableArraypada indeks tertentu, Anda akan melakukannya menggunakan metode:

- (void)insertObject:(id)anObject atIndex:(NSUInteger)index;

Metode ini disebut insertObject:atIndex:dan jelas bahwa suatu objek sedang dimasukkan pada indeks yang ditentukan.

Dalam praktiknya, menambahkan string "Halo, Dunia!" pada indeks 5 dari yang NSMutableArraydipanggil arrayakan disebut sebagai berikut:

NSString *obj = @"Hello, World!";
int index = 5;

[array insertObject:obj atIndex:index];

Ini juga mengurangi ambiguitas antara urutan parameter metode, memastikan bahwa Anda melewati parameter objek terlebih dahulu, lalu parameter indeks. Ini menjadi lebih berguna ketika menggunakan fungsi yang mengambil sejumlah besar argumen, dan mengurangi kesalahan dalam meneruskan argumen.

Lebih jauh, konvensi penamaan metode sedemikian karena Objective-C tidak mendukung overloading; namun, jika Anda ingin menulis metode yang melakukan pekerjaan yang sama, tetapi menggunakan tipe data yang berbeda, ini dapat dilakukan; ambil, misalnya, NSNumberkelas; ini memiliki beberapa metode pembuatan objek, termasuk:

  • + (id)numberWithBool:(BOOL)value;
  • + (id)numberWithFloat:(float)value;
  • + (id)numberWithDouble:(double)value;

Dalam bahasa seperti C ++, Anda cukup membebani metode angka untuk memungkinkan berbagai tipe data dilewatkan sebagai argumen; Namun, dalam Objective-C, sintaks ini memungkinkan beberapa varian berbeda dari fungsi yang sama untuk diimplementasikan, dengan mengubah nama metode untuk setiap varian fungsi.

Alex Rozanski
sumber
apakah nama parameter diperlukan selama panggilan metode (pengiriman pesan) jika nama fungsi menyertakan nama parameter?
Naveen
24

Teks sebelum setiap parameter adalah bagian dari nama metode. Dari contoh Anda, nama metode sebenarnya

-getBusStops:forTime:

Masing-masing: mewakili argumen. Dalam pemanggilan metode, nama metode dipisah pada: s dan argumen muncul setelah: seg

[getBusStops: arg1 forTime: arg2]
sigjuice
sumber
3
Saya pikir Anda lupa menambahkan nama metode.
Özgür
11

untuk membuat metode:

-(void)mymethods:(NSString *)aCont withsecond:(NSString *)a-second {
//method definition...
}

untuk panggilan metode:

[mymethods:self.contoCorrente withsecond:self.asecond];
VITROXMAN
sumber
-3
(int) add: (int) numberOne plus: (int) numberTwo ;
(returnType) functionPrimaryName : (returnTypeOfArgumentOne) argumentName functionSecondaryNa

saya:

(returnTypeOfSecontArgument) secondArgumentName ;

seperti dalam bahasa lain kami menggunakan sintaks berikut yang tidak berlaku add(int one, int second) tetapi cara menugaskan argumen OBJ_cberbeda seperti yang dijelaskan di atas

Chaudhry Umair
sumber