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

टाइप

  • प्राचीन टाइप के लिए, J2ObjC ने JNI-स्टाइल के डिफ़ को तय किया है.
  • आम तौर पर, क्लास के अलग-अलग टाइप के लिए, पैकेज को अंग्रेज़ी के बड़े अक्षरों में दिखाया जाता है और उसे क्लास के नाम के पहले जोड़ा जाता है.
  • बुनियादी ऑब्जेक्ट टाइप और सभी तरह के वैरिएबल के लिए, "id" का इस्तेमाल किया जाता है.
  • कुछ मुख्य Java टाइप, फ़ाउंडेशन टाइप पर मैप किए जाते हैं. (उदा. स्ट्रिंग से NSString
  • 'वाेलाटाइल' के लिए तय किए गए फ़ील्ड के लिए, J2ObjC में C11 _AtomicISBN टाइप का इस्तेमाल करने वाले ज़्यादा टाइपडेफ़ हैं.
  • अंदर के टाइप के लिए, अंदरूनी क्लास के नाम को बाहरी नाम के साथ अंडरस्कोर के साथ जोड़ा जाता है.
Java प्रकार मकसद-सी टाइप मकसद-सी वाेलाटाइल टाइप
बूलियन जूलियन वाेलाटाइल_बूलियन
वर्ण Jchar ज्वालामुखी
बाइट जेबाइट वाेलाटाइल_जेबाइट
छोटा जेशॉर्ट वाेलाटाइल_जेशॉर्ट
int जिन्ट वाेलाटाइल_जिन्ट
लंबा लौंग वाेलाटाइल_जॉन्ग
फ़्लोट Jफ़्लो वाेलाटाइल_जेफ़्लोट
दोगुनी Jdouble वाेलाटाइल_जडबल
java.lang.Object id वाेलाटाइल आईडी
वैरिएबल टाइप id वाेलाटाइल आईडी
java.lang.String NSस्ट्रिंग* वाेलाटाइल आईडी
java.lang.नंबर NSNumber* वाेलाटाइल आईडी
java.lang.Clooneable NSकॉपी करना* वाेलाटाइल आईडी
foo.bar FooBarMumble* वाेलाटाइल आईडी
foo.bar.Mumber$inter फ़ूबारमबल_इनर* वाेलाटाइल आईडी

तरीके

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

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

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

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

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

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

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

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

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

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

  • जनरेट किए गए 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) { ... }
}
उदाहरण मकसद-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);

कंस्ट्रक्टर

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

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

  • पहला फ़ंक्शन, नए पैरामीटर को उसके पहले पैरामीटर के तौर पर स्वीकार करता है. आम तौर पर, इस फ़ंक्शन का इस्तेमाल किसी सब-क्लास कंस्ट्रक्टर से कॉल करने के लिए किया जाता है. यह नाम रखने के नियमों का भी स्टैटिक तरीके से पालन करती है. (जहां "init" तरीके का नाम है)
  • दो फ़ंक्शन जोड़े जाते हैं, जो नए ऑब्जेक्ट को आवंटित करेंगे और उसे शुरू करेंगे. इनकी पहचान इनके प्रीफ़िक्स से होती है:
    • create_ फ़ंक्शन, अपने-आप रिलीज़ होने वाला ऑब्जेक्ट दिखाएगा.
    • new_ फ़ंक्शन, एक बनाए रखा गया ऑब्जेक्ट दिखाएगा.
Java का उदाहरण
package com.google;
class Foo {
  Foo() { ... }
  Foo(Object a, Object b) { ... }
}
उदाहरण मकसद-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;
}
उदाहरण मकसद-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;
}
उदाहरण मकसद-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 क्लास का टाइप जनरेट होता है, जो Java enum की सभी सुविधाएं देता है. इसके अलावा, फ़ाउंडेशन फ़्रेमवर्क के NS_ENUM मैक्रो का इस्तेमाल करके C enum जनरेट किया जाता है. Objective-C क्लास के टाइप का इस्तेमाल, जनरेट किए गए सभी एपीआई करते हैं. C enum, स्विच स्टेटमेंट के लिए स्थायी वैल्यू या स्टोरेज टाइप के तौर पर इस्तेमाल होता है.

enum के जनरेट किए गए टाइप के नाम यहां दिए गए हैं:

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

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

Java का उदाहरण
package com.google;
enum Color {
  RED, GREEN, BLUE
}
उदाहरण मकसद-सी हेडर
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);