Objective-C'de birden çok parametreyi nasıl iletirim?


178

Objective-C yöntemi sözdizimi hakkında yazı birkaç okudum ama bir yöntem için birden çok ad anlamıyorum sanırım.

Ben adlı bir yöntem oluşturmak çalışıyorum getBusStopsile NSStringve NSTimeIntervalparametreleri ve bir dönüş türü NSMutableArray. Bu yöntemi nasıl inşa ettik ama açıkçası çalışma zamanında hata alır:

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

Bir yöntemle başka bir örnek gördüm:

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

Neden bu yöntemin her parametre için bir yöntem adı olduğunu anlamıyorum. Ben de aynı şeyi yapmalıyım:

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

Yanıtlar:


120

Objective-C adlandırılmış parametreleri içermediğinden, iki nokta üst üste işaretinin sol tarafındaki her şey yöntem adının bir parçasıdır. Örneğin,

getBusStops: forTime:

yöntemin adıdır. Adı daha açıklayıcı olması için parçalanmıştır. Sadece yönteminizi adlandırabilirsiniz

getBusStops: :

ama bu size ikinci parametre hakkında fazla bir şey söylemiyor.


157

Her parametre adını en azından bir ":" ile sınırlamanız gerekir. Teknik olarak ad isteğe bağlıdır, ancak okunabilirlik için önerilir. Böylece şunu yazabilirsiniz:

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

veya önerileriniz:

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

15
+1: Objective-C işlev argümanları gerçekten konumlandırılmıştır, adlandırılmamıştır, bu nedenle etiket isteğe bağlıdır ve insan tüketimi içindir.
Jarret Hardie

"forTime" imzasında neden tercih edildiğinden emin değilsiniz, "timeInterval" işlevde 2. parametre olarak kullanılabilir, değil mi?
galactica

@galactica - Elbette, ad sizin için en anlamlı olan şey olabilir. Bu örnek, tutarlılık için OP terminolojisini kullanır.
EM

2
Ne için forTimekullanıldığından emin değil misiniz?
mrgloom

71

Evet; Objective-C yöntemi sözdizimi birkaç nedenden dolayı böyle; bunlardan biri, belirttiğiniz parametrelerin ne olduğu açıktır. Örneğin, NSMutableArraybelirli bir dizindeki bir nesneye bir nesne ekliyorsanız , yöntemi kullanarak bunu yaparsınız:

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

Bu yöntem çağrılır insertObject:atIndex:ve belirli bir dizine bir nesnenin eklendiği açıktır.

Pratikte, "Merhaba, Dünya!" endeks bir 5 NSMutableArrayadlandırılan arrayşöyle çağrılacak olacaktır:

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

[array insertObject:obj atIndex:index];

Bu aynı zamanda yöntem parametrelerinin sırası arasındaki belirsizliği azaltır ve önce object parametresini, sonra index parametresini iletmenizi sağlar. Bu, çok sayıda bağımsız değişken alan işlevleri kullanırken daha kullanışlı hale gelir ve bağımsız değişkenleri iletme hatasını azaltır.

Ayrıca, yöntem adlandırma kuralı böyledir çünkü Objective-C aşırı yüklemeyi desteklemez; ancak, aynı işi yapan ancak farklı veri türleri alan bir yöntem yazmak istiyorsanız, bu gerçekleştirilebilir; örneğin, NSNumbersınıfı ele alalım ; bunun çeşitli nesne oluşturma yöntemleri vardır:

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

C ++ gibi bir dilde, farklı veri türlerinin bağımsız değişken olarak iletilmesine izin vermek için sayı yöntemini aşırı yüklemeniz yeterlidir; bununla birlikte, Objective-C'de bu sözdizimi, işlevin her bir varyantı için yöntemin adını değiştirerek aynı işlevin birkaç farklı varyantının uygulanmasına izin verir.


adı parametre adları içeriyorsa, yöntem çağrısı (mesaj gönderme) sırasında parametre adları gerekli midir?
Naveen

24

Her parametrenin önündeki metin , yöntem adının bir parçasıdır . Örneğinizden, yöntemin adı aslında

-getBusStops:forTime:

Her biri: bir argümanı temsil eder. Bir yöntem çağrısında, yöntem adı: s'ye bölünür ve argümanlar: seg'dan sonra görünür

[getBusStops: arg1 forTime: arg2]

3
Sanırım yöntemin adını eklemeyi unuttun.
Özgür

11

oluşturma yöntemi için:

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

yöntemi çağırmak için:

[mymethods:self.contoCorrente withsecond:self.asecond];

-3
(int) add: (int) numberOne plus: (int) numberTwo ;
(returnType) functionPrimaryName : (returnTypeOfArgumentOne) argumentName functionSecondaryNa

ben mi:

(returnTypeOfSecontArgument) secondArgumentName ;

diğer dillerde olduğu gibi aşağıdaki sözdizimi boşluğunu kullanıyoruz add(int one, int second) ancak bağımsız değişken atama yöntemi OBJ_cyukarıda açıklandığı şekilde farklı

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.