Ob'ektiv sintaksisi

Objective-C dasturlash uchun yangi dastur. Men juda ko'p darsliklarda ushbu formatda kodni ko'rmoqdaman:

[[classname function] function];

Misol uchun:

[[NSString alloc] initwithformat:parameters];

Men plist va lug'atlar haqida bilib olganimda ushbu kod satrini ko'rdim:

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

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

Kimdir bu sintaksikning qanday ishlashini va birinchi va ikkinchi misol o'rtasidagi farqni tushuntirib bering.

Shuningdek, ushbu misollar uchun C yoki Java-da teng so'zlarni taqdim etsangiz, albatta foydali bo'lardi.

1
Mkb-ning tahrirlari OPning ma'nosini nazarda tutamiz, chunki original sintaksisi noqonuniy ( [classname function] function] ).
qo'shib qo'ydi muallif Rob Napier, manba

7 javoblar

[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-da siz ham [] brauzerida qo'ng'iroqlarni "yuvish" mumkin. [[Classname method1] method2] bir necha obyektni qaytaradigan va method2 usulini chaqiradigan usulini kodi> ni tanlang.

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

Shuni ham ta'kidlash joizki, qattiq ob'ektiv S terminologiyasida Siz «ob'ektdagi usulni chaqirmaydi», uning o'rniga «ob'ektga xabar yuborasiz». Xuddi shu narsa, turli so'zlar.

6
qo'shib qo'ydi
Katta rahmat! Bu, albatta, foydalidir
qo'shib qo'ydi muallif user1018457, manba

Bu shunchaki transvizorli parametrlarni yoki narsalarni yaratishga xalaqit beradigan stend belgisidir. Siz xohlaganingizdan ko'pchiligingizni joylashtirishingiz mumkin, lekin kodni o'qilishi mumkin.

Masalan, rasm nomlari bo'lgan qatorli qatorlar mavjud bo'lsa, rasmni olish uchun buni amalga oshirishingiz mumkin:

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

NSString o'zgaruvchisiz bajarishni istasangiz, quyidagilarni yozishingiz mumkin:

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

Aniqmi?

1
qo'shib qo'ydi

Ushbu. formati olish usuli uchun qisqartirilgan. Misol uchun, agar shaxs ob'ekti yoshga ega bo'lsa va sizda getAge usuli aniqlangan bo'lsa (yoki sintez qilingan bo'lsa), siz [person getAge] yoki person.ageni chaqirishingiz va teng natijalarga erishishingiz mumkin.

0
qo'shib qo'ydi

Sizning chalkashliklar nuqta belgisiga aylangan deb o'ylayman, chunki bu ko'pincha yangi ishlab chiquvchilarni chalkashtiradi. Tilga noqulay va yaqin qo'shilgan edi. Shuningdek, mkb-ning tahrirlari to'g'ri deb hisoblayman, chunki asl kodingiz qonuniy emas edi.

Ushbu qo'ng'iroq:

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

Is precisely the same as Ushbu qo'ng'iroq:

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

Bu C ++ kabi tilda qo'pol ekvivalent bo'lishi mumkin:

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

ObjC va C ++ yondashuvlari qanday usullarni qo'llash bo'yicha turli yondashuvlarga ega, chunki ko'p hollarda bular bir xil bo'ladi.

Boshqa orqa qismlar bilan tanishib chiqing . Shuningdek, objective-cdasturlash tili boshlang'ich yoki mavzu bo'yicha mustahkam kitob sifatida.objective-cJava va C ++ dan juda farq qiladi va mening tajribamga ko'ra, siz uni qabul qilishni boshlashga harakat qilsangiz, keyinchalik katta tartibsizlik va umidsizlikka olib keladi. "ObjC-dagi ushbu C ++ ni qanday qilishim kerak?" Degan savolni emas, balki o'z tilini o'rganish yaxshi bo'ladi. Jadvalning yarmi - siz yo'q.

0
qo'shib qo'ydi

OK, birinchi narsa. [[obj method1] method2] versiyasi method1 xabarini obj yuboradi va keyin method2 [obj method1] ning qaytish qiymati.

Ikkinchi misol, [[self.objname objectAtIndex: indexPath.row] objectForKey: @ "somename"] biroz murakkab. self.objname , self ob'ektining objname xususiyatiga kirishdir (o'z-o'zidan har doim o'z ob'ekt namunasiga murojaat qiladi). [self.objname objectAtIndex: indexPath.row] bilan objectAtIndex self.objname tomonidan qaytarilgan ob'ektga parametr bilan yuboriladi indexPath.row . indexPath , yana bir narsa va siz satr xususiyatiga kirasiz. Va qaytib kelganida siz objectForKey xabarini @ "somename" parametr bilan yuborasiz. Va @ "str" ​​ob'ektiv-c strings uchun o'rnatilgan sintaksisi.

HTH

0
qo'shib qo'ydi

Umuman olganda, qavslar siz ob'ektga xabar yuborishingizni anglatadi. Agar xabar shuningdek, ob'ekt bo'lgan qiymatni qaytaradigan bo'lsa, siz o'sha ob'ektga xabar yuborishingiz mumkin. Sizning birinchi misolingizning ichki xati alloc xabarini NSString class ob'ektiga yuboradi. Bu NSString turidagi ajratilgan ob'ektga markerni qaytaradi. initWithFormat: xabari keyin mag'lubiyatning tarkibini ishga tushiradi.

Java'da bu narsa shunday bo'ladi:

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

va boshqa faylda:

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

Java-ning ob'ekt modeli "Objective-C" bilan bir xil emas, shuning uchun bu faqat taxminan.

0
qo'shib qo'ydi
thanks.exactly nima izlayotgani
qo'shib qo'ydi muallif user1018457, manba

[self.objname objectAtIndex: indexPath.row] objectForKey: @ "somenam"]; asosan shunday qiladi:

Bir qator lug'at (dizayni objname) mavjud va siz objectAtIndex bilan lug'atni aniqlaysiz. Keyinchalik, lug'atda ushbu kalitlar uchun bir qator kalit va qiymatlar mavjud. ObjectForKey: id yordamida bir qiymatni belgilaysiz.

Bir oz uzunroq soddalashtirilgan sintaksis bo'lishi mumkin:

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