Amaç c sözdizimi

Objective-C programlamasında yeniyim. Birçok öğreticide bu formatla kod görüyorum:

[[classname function] function];

Örneğin:

[[NSString alloc] initwithformat:parameters];

Ben plist ve sözlükleri öğrenirken, bu kod satırını gördüm:

[[self.objname objectAtIndex:indexPath.row] objectForKey:@"somename"];

I believe it follows the syntax: [[objectname function] function]

Birisi bu sözdiziminin nasıl çalıştığını ve ilk ve ikinci örnek arasındaki farkı açıklayabilir.

Ayrıca, bu örnekler için C veya Java'da eşdeğer ifadeler sağlamanız gerçekten yararlı olacaktır.

1
Orijinal sözdizimi yasadışı olduğundan ( [classname function] function] ), mkb'nin düzenlemelerinin OP'nin ne anlama geldiğini varsayıyoruz.
katma yazar Rob Napier, kaynak

7 cevap

[ClassName methodName] is how you call a class method. The equivalent in Java is Classname.methodName();

[object methodName] is how you call a normal instance method. The equivalent in Java is object.methodName();

Objective C'de, [] parantezlerinde de 'yuvalama' yapabilirsiniz. [[Classname method1] method2] , bazı nesneleri döndüren method1 sınıf yöntemini çağırmakla eşdeğerdir ve sonra method2 bu nesnede.

The equivalent in Java would be Classname.method1().method2();

Ayrıca, Objektif C terminolojisinde 'bir nesnede bir yöntemi çağırmazsınız', bunun yerine bir nesneye 'mesaj gönderirsiniz'. Aynı şey, farklı kelimeler.

6
katma
Çok teşekkürler! Bu gerçekten yardımcı oldu
katma yazar user1018457, kaynak

Bu, geçici değişkenler veya nesneler oluşturmayı önleyen kısa bir göstergedir. Bunların çoğunu istediğiniz gibi yerleştirebilirsiniz, ancak kodu okunabilir durumda tutmalısınız.

Örneğin. görüntü isimleri olan bir dizi diziniz varsa, görüntüyü elde etmek için bunu yapabilirsiniz:

NSString *imageName = [imageArray objectAtIndex:0];
UIImage *image = [UIImage imageNamed:imageName];

NSString değişkeni olmadan yapmak isterseniz, şunları yazabilirsiniz:

UIImage *image = [UIImage imageNamed:[imageArray onjectAtIndex:0]];

Açık?

1
katma

. format, get yöntemi için kısa yoldur. Örneğin, bir kişi nesnesinin bir yaşı varsa ve bir getAge yöntemini tanımladıysanız (veya sentezlediyseniz), [kişi getAge] veya person.age'i arayabilir ve eşdeğer sonuçlar alabilirsiniz.

0
katma

Bu, yeni geliştiricilerin kafasını karıştırdığı için, karışıklığınızın nokta-notasyona bağlı olduğunu varsayacağım. Bu dil için garip ve son bir ek oldu. Orijinal kodunuzun yasal olmadığı için, mkb'nin düzenlemelerinin doğru olduğunu varsayacağım.

Bu çağrı:

[[self.objname objectAtIndex:indexPath.row] objectForKey:@"somename"];

Is precisely the same as Bu çağrı:

[[[self objname] objectAtIndex:[indexPath row]] objectForKey:@"somename"];

Muhtemelen C ++ gibi bir dilde kabaca eşdeğerdir:

this.objname.objectAtIndex(indexPath.row).objectForKey("somename");

Bu, kaba bir denkliktir, çünkü ObjC ve C ++, yöntemlerin nasıl çağrıldığı konusunda farklı yaklaşımlara sahiptir, ancak çoğu durumda bunlar aynı olacaktır.

Diğer geçmişlerle Kakao Öğrenme ile ilgilenebilirsiniz. Ayrıca Hedef-C Programlama Dili'ni şiddetle tavsiye ederim. Bir başlangıç ​​olarak veya konuyla ilgili sağlam bir kitap. Objective-C, Java ve C ++ 'dan çok farklıdır ve benim tecrübelerime göre, giderken onu almaya çalışmak, daha sonra kayda değer bir kafa karışıklığına ve hayal kırıklığına yol açacaktır. Dili “ObjC'de bu C ++ meselesini nasıl yapabilirim?” Anlamaya çalışmak yerine dili kendi terimlerinde öğrenmek en iyisidir. Cevabın yarısı: yapmazsın.

0
katma

Tamam, önce ilk şeyler. [[obj method1] method2] varyantı method1 mesajını obj 'e gönderir ve sonra method2 mesajını gönderir. [obj method1] öğesinin dönüş değeri.

İkinci örnek [[self.objname objectAtIndex: indexPath.row] objectForKey: @ "somename"] biraz daha karmaşıktır. self.objname , self nesnesinin objname özelliğine bir erişimdir (self her zaman kendi nesne örneğine başvurur). [self.objname objectAtIndex: indexPath.row] ile objectAtIndex iletisi, self.objname tarafından döndürülen nesneye parametre ile gönderilir. indexPath.row . indexPath , yine bir nesnedir ve row özelliğine erişirsiniz. Ve bu dönüş değeri üzerine objectForKey iletisini @ "somename" ile gönderirsiniz. Ve @ "str" ​​nesnel-c dizeleri için yerleşik bir sözdizimidir.

HTH

0
katma

Genel olarak, parantezler bir nesneye bir mesaj gönderdiğiniz anlamına gelir. Mesaj aynı zamanda bir nesne olan bir değer döndürürse, o nesneyi de bir mesaj gönderebilirsiniz. İlk örneğinizin iç mesajı atama mesajını NSString sınıf nesnesine gönderir. Bu, NSString tipinde ayrılmış bir nesneye bir işaretçi döndürür. initWithFormat: iletisi daha sonra dizenin içeriğini başlatır.

Java'da, şöyle bir şey olurdu:

public class NSString {
  public static NSString alloc() {
    return new byte[];
  }
  public void initWithParameters(Map params) {
    /* initialize */
  }
}

ve başka bir dosyada:

NSString str = NSString.alloc().initWithParameters(params);

Ancak Java'nın nesne modeliobjective-cile tamamen aynı değildir, bu yüzden bu sadece bir yaklaşımdır.

0
katma
thanks.exactly ne aradım
katma yazar user1018457, kaynak

[self.objname objectAtIndex: indexPath.row] objectForKey: @ "somename"]; temelde bunu yapıyor:

Bir dizide bir sözlük var (dizi şöyledir) ve sözlüğü objectAtIndex ile hedefliyorsunuz. Sonraki sözlük, bu tuşlar için bir dizi anahtar ve değer içerir. ObjectForKey: id işlevini kullanarak bir değeri hedeflersiniz.

Biraz daha basit bir sözdizimi şöyle olurdu:

 NSDictionary *dict = [objname objectAtIndex:indexPath.row];
 NSLog(@"%@", [dict [email protected]"key"];
0
katma