Objective-C'de Yöntem Sözdizimi


176

Birisi benim için bu yöntem bildirimi sözdizimini açıklayabilir mi? Bu işlevde, bir UIPickerView (iPhone'daki slot makinesi UI) satır sayısı döndürülüyor. Anladığım kadarıyla, Metod ' pickerView' olarak adlandırılır ve bir NSInteger döndürür.

UIPickerview'e bir işaretçi içinde ' pickerView' ... denir , ilk olarak, yöntem neden parametre ile aynı ad olarak adlandırılır?

Daha sonra, bize hangi satırları saydığımızı söyleyen bileşen adı verilen NSInteger parametresi var. Hangisinin yöntemin gövdesinde olduğuna karar vermek için mantık.

Nedir numberOfRowsInComponent? Döndürdüğümüz değeri açıklıyor gibi görünüyor, ancak parametrelerin ortasında.

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

    return[self.zips count];
}

Yanıtlar:


358

Objective-C yöntemleri kendini belgelemek üzere tasarlanmıştır ve Smalltalk'ın zengin geleneğinden ödünç alırlar.

Burada ne olduğunu açıklamaya çalışacağım -(NSInteger) pickerView:(UIPickerView*)pickerView numberOfRowsInComponent:(NSInteger)component.

  • - (NSInteger)
    Bu ilk bölüm, bunun bir NSInteger nesnesi döndüren bir Objective C örneği yöntemi olduğunu gösterir. -(çizgi), bu, bir olduğunu gösterir , örneğin bir yöntem olup, +bu olduğuna işaret edecek sınıf yöntemi. Parantez içindeki ilk değer yöntemin dönüş türüdür.

  • pickerView:
    Bu bölüm mesaj adının bir parçasıdır . Tam ileti adı bu durumda olduğunu pickerView:numberOfRowsInComponent:. Objective-C çalışma zamanı bu yöntem bilgisini alır ve belirtilen alıcıya gönderir. Saf C'de, bu gibi görünecektir
    NSInteger pickerView(UIPickerView* pickerView, NSInteger component). Ancak, bu Objective-C olduğundan, mesaj adına ek bilgiler paketlenmiştir.

  • (UIPickerView*)pickerView
    Bu bölüm girdinin bir parçasıdır . Buradaki girdi UIPickerView*türdedir ve pickerView yerel değişken adına sahiptir.

  • numberOfRowsInComponent:
    Bu kısım, mesaj adının ikinci kısmıdır . Burada görebileceğiniz gibi, alıcıya hangi bilgileri ilettiğinizi belirtmek için mesaj adları ayrılır. Ben mesaja değişkenler foo ve bar ile bir nesne myObject olsaydı Böylece, ben yazın:
    [myObject pickerView:foo numberOfRowsInComponent:bar];
    C ++ tarzı aksine:
    myObject.pickerView(foo, bar);.

  • (NSInteger)component
    Bu, girdinin son kısmıdır . buradaki girdi türdedir NSIntegerve bileşenin yerel değişken adına sahiptir.


18
Harika bir cevap için +1. "+" Resmi olarak bir sınıf yöntemini gösterdiğinden, ilk noktanızda "fabrika" yı "sınıf" olarak değiştirmenizi öneririm. Çoğu "+" yönteminin fabrika yöntemi olduğu, ancak bu doğru bir tanım olmadığıdır.
J.James

2
Teşekkürler! Başka bir soru: Eğer bir nesne myObject 'e gösterdiğiniz gibi foo ve bar değişkenleriyle mesaj gönderirseniz: [myObject pickerView: foo numberOfRowsInComponent: bar]; PickerView yöntem adına veya parametresine atıfta bulunuyor mu?
Craig

2
Ne. Hem yöntem adı AND parametresine başvurması iyi bir stildir, ancak tam yöntem adı aslında pickerView: numberOfRowsInComponent: 'dir. PickerView: işlevini çağırmayı denediyseniz, yöntem mevcut olmadığından bir çalışma zamanı hatası alırsınız.
Locriani

1
Bunu açıklığa kavuşturayım: pickerView: kısmı tek başına iyi kodlama stilini takip etmek için aşağıdaki parametreye başvurmalıdır. Ancak, yöntem adının yalnızca 1 / 2'sidir. Daha iyi bir örnek, yöntem myX: Y: olduğunda [myObject setX: foo Y: bar] olabilir.
Locriani

1
Bu cevabın eski olduğunu biliyorum, ama son birkaç yıldır bir .NET dünyasında yaşıyorum. Objective C'de yeniyim ve bir web dünyasından mobil endüstriye geçiyorum. Soruyla bu kadar alakalı, iyi belgelenmiş bir açıklama için size teşekkür etmek istiyorum. +1
d3v1lman1337

52

Objective-C'de bir yöntemin adı, bildirgenin argüman ve tür olmayan tüm kısımlarından oluşur. Dolayısıyla bu yöntemin adı şöyle olacaktır:

pickerView:numberOfRowsInComponent:

Yöntem, aşağıdaki gibi görünen bir C stili işlevine eşdeğer olacaktır:

edit: ( Jarret Hardie sayesinde ):

NSInteger pickerViewNumberOfRowsInComponent(UIPickerView * pickerView, NSInteger component)

1
+1 - güzel kısa açıklama. Bazen "NSInteger seçici ViewNumberOfRowsInCompoent (UIPickerView * pickerView, NSInteger bileşeni) olarak C stili eşdeğerini yazarsanız insanlar için ampulün devam ettiğini görüyorum
Jarret Hardie

Açıklamanızı seviyorum, C'de yeniden yazmak çok daha iyi.
lcc

30

Önceki yanıtlara ek olarak, Objective-C yöntemlerinin (veya isterseniz mesajların) harici ve dahili parametre adlarına sahip olduğunu söylemek isterim .

Yani bu durumda:

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

numberOfRowsInComponentolan dış ad, dışarıdan bu yöntemi çağrılırken kullanmak edeceğini biri.

Ve componentolan parametre, sen yönteminin içeriden parametrelerden bahsetmek için kullandığınız adı.

Umarım bu onu biraz temizler.


1
Açıklamanıza göre, yöntem adı ilk parametrenin harici adı olarak düşünülebilir. Bu aynı zamanda wilczarz'ın feryat yorumuna da uyar.
Jake

Kahretsin, bu cevabı çok yanlış buluyorum. Parametrelerin harici / dahili adı gibi bir şey yoktur. Bu TYPE ve DEĞİŞKEN tanıtıcıdır. Herkesin neden ObjC'yi doğal bir dil olarak tanımlamak için çok uğraştığını merak ediyorum, bu her yönden doğal değil. Bu bir dil, bu, etrafındaki süslü kelimeler kullanmadan öğrenmenizi sağlar.
Siddharth

Bağımsız değişkenlerin dahili / harici adları olabilir. Bu doğru.
lcc

21

Bana öyle geliyor ki Objective-C yöntemi imzaları daha çok cümle gibidir. Her parametre yöntemin adında bir parçayı hak eder. Örneğin, C'de kişi hakkında bazı bilgileri ayarlamak için bir yöntemimiz olabilir ( setPersonData ):

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

ve Objective-C'de yöntem daha açıklayıcı olur ( setPersonName: andAge: andHeight:) ,

- (void) setPersonName: (char *)name andAge:(int)age andHeight:(float)height {

8
Ve neden setPersonalData (char * veName, int alsoAge, float alsoHeight) bir anlam ifade etmiyor? Sözdizimi hakkında anladığınız her şey, objc tasarımcılarının burada akıllı olma niyeti hakkında hiçbir şey yok. Açıkçası hiç mantıklı olmayan bir grup daha sözdizimi eklediler .. :)
Siddharth

5
Korktuğum cevabı yanlış anladın. setPersonalData (char * veName, int alsoAge, float alsoHeight) çağrı değil, imzadır. Bu işlevin çağrılması setPersonData ("Tom", 25, 175) - olacaktır ve bu pek bir şey ifade etmiyor mu? Obj-C çağrısı şöyle görünecektir: [person setPersonName: @ "Tom" ve Yaş: 25 andHeight: 175];
wilczarz

3
Şimdi düşündüğüme göre, cevabım bir açıklamadan çok bir şikayet. Daha fazla anlaşamadım.
Siddharth
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.