अनुवाद का रेफ़रंस

टाइप

  • प्रिमिटिव टाइप के लिए, J2ObjC ने JNI-स्टाइल टाइपडिफ़ को तय किया है.
  • सामान्य क्लास टाइप के लिए, पैकेज को ऊंट के केस में रखा जाता है और उसे क्लास के नाम से पहले जोड़ा जाता है.
  • बेस ऑब्जेक्ट टाइप और सभी टाइप के वैरिएबल के लिए, "id" का इस्तेमाल किया जाता है.
  • कुछ प्रमुख Java टाइप, फ़ाउंडेशन टाइप के साथ मैप किए गए हैं. (उदा. स्ट्रिंग से NSString)
  • 'वोलेटाइल' फ़ील्ड के लिए, J2ObjC में ऐसे ज़्यादा टाइपडिफ़ हैं जो C11 _Atomic(...) टाइप का इस्तेमाल करते हैं.
  • इनर टाइप के लिए, इनर क्लास के नाम को बाहरी नाम के साथ अंडरस्कोर से जोड़ा जाता है.
Java का टाइप Objective-C टाइप Objective-C में उतार-चढ़ाव का टाइप
बूलियन बूलियन volatile_jboolean
वर्ण जकर volatile_jchar
बाइट जेबाइट volatile_jbyte
छोटा जेशॉर्ट volatile_jshort
int जिंट volatile_jint
लंबा जेलॉन्ग volatile_jlong
फ़्लोट जेफ़्लोट volatile_jfloat
दोगुनी जेडबल volatile_jdouble
java.lang.Object आईडी volatile_id
टाइप वैरिएबल आईडी volatile_id
java.lang.String NSString* volatile_id
java.lang.Number NSNumber* volatile_id
java.lang.Cloneable एनएसकॉपी करना* volatile_id
foo.bar.Mumble फ़ूबारमंबल* volatile_id
foo.bar.Mumber$Inner FooBarMumble_Inner* volatile_id

तरीके

Objective-C तरीके, Java के तरीकों से दो अहम तरीकों से अलग होते हैं. वे वाक्यात्मक रूप से होते हैं अलग है, जिसमें पैरामीटर को मेथड सिलेक्टर के कॉम्पोनेंट के बीच एम्बेड करना होगा. Objective-C मेथड ओवरलोडिंग के साथ काम नहीं करतीं, जैसा कि Java करती है. इन अंतरों को पैरामीटर टाइप को, जनरेट किए गए सिलेक्टर में शामिल किया जाता है. इनके बीच नाम टकराव से रोकने के लिए यह ज़रूरी है को ज़्यादा लोड किया जा सकता है.

Java के तरीके तीन तरह के होते हैं, जो जनरेट किए गए एपीआई में अलग-अलग होते हैं: इंस्टेंस मेथड, स्टैटिक मेथड, और कंस्ट्रक्टर हैं. इंस्टेंस मेथड का इस्तेमाल Objective-C इंस्टेंस मेथड के तौर पर किया जाता है. स्थायी मेथड और कंस्ट्रक्टर, C-स्टाइल फ़ंक्शन में बदल जाते हैं, लेकिन ये Objective-C रैपर भी जोड़ते हैं Objective-C डेवलपर को ज़्यादा जानकारी वाला एपीआई उपलब्ध कराया जा सकता है.

इंस्टेंस के तरीके

तरीकों के नाम इस तरह जनरेट किए जाते हैं:

  • पैरामीटर के शून्य तरीके नहीं बदले गए हैं
  • एक या उससे ज़्यादा पैरामीटर, इन पैटर्न का इस्तेमाल करते हैं:
    • <java name>With<1st param keyword>:with<2nd param keyword>:with<3rd param keyword>:
  • पैरामीटर वाले कीवर्ड नियम:
    • प्रिमिटिव टाइप के लिए कीवर्ड, Java प्रिमिटिव का कैपिटल लेटर वाला नाम है. (उदा. "चार")
    • नॉन-प्रिमिटिव टाइप के लिए कीवर्ड, ऊंट के केस वाला पूरी तरह क्वालिफ़ाइड नाम होता है. (उदा. "ComGoogleFoo")
    • अरे टाइप के लिए, "अरे" को एलिमेंट टाइप के कीवर्ड में जोड़ा जाता है.
Java का उदाहरण
interface Foo {
  void bar();
  String bar(int i);
  java.util.List bar(String s, long[] l);
}
Objective-C का उदाहरण
- (void)bar;

- (NSString *)barWithInt:(jint)i;

- (id<JavaUtilList>)barWithNSString:(NSString *)s
                      withLongArray:(IOSLongArray *)l;

स्टैटिक तरीके

ऑब्जेक्टिव-सी क्लास मेथड को, इंस्टेंस मेथड वाले नाम रखने के नियमों के हिसाब से ही जोड़ा जाता है.

सी-स्टाइल फ़ंक्शन, नाम रखने के इन नियमों का इस्तेमाल करके जोड़ा जाता है:

  • जनरेट किए गए Objective-C सिलेक्टर से शुरुआत करें. (उदा. barWithInt:)
  • कोलन को अंडरस्कोर से बदलें. (उदा. barWithInt_)
  • अंडरस्कोर से अलग किए गए, क्लास के नाम के आगे जोड़ें. (उदा. ComGoogleFoo_barWithInt_)
Java का उदाहरण
package com.google;
class Foo {
  static boolean bar() { ... }
  static double bar(int[] i) { ... }
  static void bar(String s, boolean b) { ... }
}
Objective-C का उदाहरण
@interface Foo : NSObject

+ (jboolean)bar;

+ (jdouble)barWithIntArray:(IOSIntArray *)i;

+ (void)barWithNSString:(NSString *)s
            withBoolean:(jboolean)b;

@end

FOUNDATION_EXPORT jboolean ComGoogleFoo_bar();

FOUNDATION_EXPORT jdouble ComGoogleFoo_barWithIntArray_(IOSIntArray *i);

FOUNDATION_EXPORT void ComGoogleFoo_barWithNSString_withBoolean_(NSString *s, jboolean b);

कंस्ट्रक्टर

Objective-C कन्वेंशन के बाद, init इंस्टेंस मेथड जोड़ा जाता है. अगर कंस्ट्रक्टर के पास पैरामीटर में, उसी नामकरण नियम का उपयोग किया जाता है, जो इंस्टेंस विधियों के रूप में उपयोग किया जाता है.

तीन सी-स्टाइल फ़ंक्शन जोड़े गए हैं:

  • पहला फ़ंक्शन, किसी नए ऑब्जेक्ट को पहले पैरामीटर के तौर पर स्वीकार करता है. यह फ़ंक्शन है आम तौर पर, इसका इस्तेमाल सब-क्लास कंस्ट्रक्टर से कॉल करने के लिए किया जाता है. यह स्टैटिक नाम के नियमों का ही पालन करता है तरीकों का इस्तेमाल करना होगा. (जहां "init" तरीके का नाम है)
  • दो फ़ंक्शन जोड़े जाते हैं, जो नए ऑब्जेक्ट को आवंटित करेंगे और शुरू करेंगे. उन्हें अलग पहचान दी जाती है इसके प्रीफ़िक्स के हिसाब से:
    • create_ फ़ंक्शन, अपने-आप रिलीज़ होने वाला ऑब्जेक्ट दिखाएगा.
    • new_ फ़ंक्शन, बनाए गए ऑब्जेक्ट को दिखाएगा.
Java का उदाहरण
package com.google;
class Foo {
  Foo() { ... }
  Foo(Object a, Object b) { ... }
}
Objective-C का उदाहरण
@interface ComGoogleFoo : NSObject

- (instancetype)init;

- (instancetype)initWithId:(id)a
                    withId:(id)b;

@end

FOUNDATION_EXPORT void ComGoogleFoo_init(ComGoogleFoo *self);

FOUNDATION_EXPORT ComGoogleFoo *new_ComGoogleFoo_init() NS_RETURNS_RETAINED;

FOUNDATION_EXPORT ComGoogleFoo *create_ComGoogleFoo_init();

FOUNDATION_EXPORT void ComGoogleFoo_initWithId_withId_(ComGoogleFoo *self, id a, id b);

FOUNDATION_EXPORT ComGoogleFoo *new_ComGoogleFoo_initWithId_withId_(id a, id b) NS_RETURNS_RETAINED;

FOUNDATION_EXPORT ComGoogleFoo *create_ComGoogleFoo_initWithId_withId_(id a, id b);

फ़ील्ड

इंस्टेंस फ़ील्ड (न बदलने वाली)

Java इंस्टेंस वैरिएबल, Objective-C इंस्टेंस वैरिएबल बन जाते हैं. नाम और ट्रेलिंग का मतलब एक जैसा है अंडरस्कोर देखें. प्रिमिटिव फ़ील्ड को "फ़ाइनल" घोषित किया गया एक विशेष मामला है और उसका उदाहरण वैरिएबल.

  • "->" का इस्तेमाल करके, फ़ील्ड को सीधे ऐक्सेस किया जा सकता है सिंटैक्स.
  • प्रिमिटिव फ़ील्ड को सीधे सेट किया जा सकता है.
    • फ़ाइनल प्रिमिटिव (कॉन्सटेंट) का अनुवाद स्टैटिक कॉन्सटेंट की तरह किया जाता है. (स्टैटिक फ़ील्ड देखें)
  • नॉन-प्रीमिटिव फ़ील्ड को दिए गए सेटर फ़ंक्शन का इस्तेमाल करके सेट किया जाना चाहिए:
    • ClassName_set_fieldName_(instance, value)
Java का उदाहरण
package com.google;
class Foo {
  public int myInt;
  public String myString;
}
Objective-C का उदाहरण
Foo *foo = [[Foo alloc] init];

// Access a primitive field.
i = foo->myInt_;

// Set a primitive field.
foo->myInt_ = 5;

// Access a non-primitive field.
NSString *s = foo->myString_;

// Set a non-primitive field.
ComGoogleFoo_set_myString_(foo, @"bar");

स्टैटिक फ़ील्ड

स्टैटिक वैरिएबल को ऐक्सेस करने के लिए, दिए गए गैटर और सेटर फ़ंक्शन का इस्तेमाल किया जाना चाहिए. ये ऐक्सेसर फ़ंक्शन यह पक्का करते हैं कि वैरिएबल को ऐक्सेस करने से पहले क्लास शुरू की गई हो.

  • स्टैटिक फ़ील्ड ऐक्सेस करना
    • ClassName_get_fieldName()
  • कोई (नॉन-फ़ाइनल) स्टैटिक फ़ील्ड असाइन करें
    • ClassName_set_fieldName()
  • किसी प्रिमिटिव स्टैटिक फ़ील्ड के लिए पॉइंटर पाना
    • ClassName_getRef_fieldName()
    • यह सिर्फ़ नॉन-फ़ाइनल और नॉन-वोलाटाइल फ़ील्ड के लिए उपलब्ध है.

फ़ाइनल प्रिमिटिव फ़ील्ड (कॉन्सटेंट) को सीधे ऐक्सेस करना सुरक्षित है, क्योंकि उनकी वैल्यू, क्लास शुरू करने की प्रोसेस पर निर्भर नहीं करती.

  • ClassName_fieldName
Java का उदाहरण
package com.google;
class Foo {
  public static final MY_FINAL_INT = 5;
  public static int myInt;
  public static String myString;
}
Objective-C का उदाहरण
// Access a primitive constant field.
jint i = ComGoogleFoo_MY_FINAL_INT;   // No class initialization
i = ComGoogleFoo_get_MY_FINAL_INT();  // Class initialization

// Access a primitive field.
i = ComGoogleFoo_get_myInt();

// Set a primitive field.
ComGoogleFoo_set_myInt(5);

// Access a non-primitive field.
NSString *s = ComGoogleFoo_get_myString();

// Set a non-primitive field.
ComGoogleFoo_set_myString(@"bar");

Enums

J2ObjC हर Java enum के लिए दो टाइप जनरेट करता है. एक Objective-C क्लास टाइप जनरेट किया जाता है, जो और ज़्यादा काम नहीं कर पाएगा. इसके अलावा एक C enum फ़ाउंडेशन का इस्तेमाल करके जनरेट किया जाता है फ़्रेमवर्क का NS_ENUM मैक्रो. Objective-C क्लास टाइप का इस्तेमाल, जनरेट किए गए सभी एपीआई में किया जाता है. C enum इसका इस्तेमाल, स्विच स्टेटमेंट के लिए कॉन्स्टेंट वैल्यू या स्टोरेज टाइप के तौर पर किया जा सकता है.

जनरेट किए गए ईनम के नाम इस तरह हैं:

  • Objective-C क्लास को उसी नियम का इस्तेमाल करके नाम दिया जाता है जो सामान्य Java क्लास का होता है. (टाइप देखें)
  • C enum को सामान्य Java क्लास के तौर पर नाम दिया गया है. इसमें "_Enum" जोड़ा गया है प्रत्यय.

इनम कॉन्सटेंट को स्टैटिक फ़ील्ड की तरह ऐक्सेस किया जाता है.

Java का उदाहरण
package com.google;
enum Color {
  RED, GREEN, BLUE
}
Objective-C हेडर का उदाहरण
typedef NS_ENUM(NSUInteger, ComGoogleColor_Enum) {
  ComGoogleColor_Enum_RED = 0;
  ComGoogleColor_Enum_GREEN = 1;
  ComGoogleColor_Enum_BLUE = 2;
};

@interface ComGoogleColor : JavaLangEnum < NSCopying >
+ (IOSObjectArray *)values;
+ (ComGoogleColor *)valueOfWithNSString:(NSString *)name;
@end

inline ComGoogleColor *ComGoogleColor_get_RED();
inline ComGoogleColor *ComGoogleColor_get_GREEN();
inline ComGoogleColor *ComGoogleColor_get_BLUE();

// Provides conversion from ComGoogleColor_Enum values.
FOUNDATION_EXPORT ComGoogleColor *ComGoogleColor_fromOrdinal(NSUInteger ordinal);