مرجع الترجمة

الأنواع

  • بالنسبة إلى الأنواع الأولية، حدّدت J2ObjC أنواع نوع JNI.
  • بالنسبة إلى أنواع الفئات المعتادة، يتم تضمين الحزمة في عبوة الجمال وتُضاف إلى اسم الفئة.
  • بالنسبة إلى نوع الكائن الأساسي وجميع متغيرات النوع، يتم استخدام "id".
  • يتم ربط بعض أنواع جافا الأساسية بأنواع الأساسات. (مثال: سلسلة إلى NSString)
  • بالنسبة إلى الحقول التي تم إعلانها على أنها "متغيّرة"، يتضمّن J2ObjC المزيد من أنواع الاستدعاءات التي تستخدم أنواع C11 _Atomic(...) .
  • بالنسبة إلى الأنواع الداخلية، يتم إلحاق اسم الفئة الداخلية بالاسم الخارجي بشرطة سفلية.
نوع جافا نوع الهدف ج النوع المتغيّر للهدف ج
منطقي قبولي متقلب_Jboolean
char jchar متقلب_jchar
بايت jبايت volatile_jbyte
فيديو قصير شورت قصير متغيّر_قصير
int جينت _Fatile_jint
شعر طويل لونغ متقلب_jlong
عدد عائم عائمة _float_jfloat
مزدوج جدوبل متقلب_jdouble
java.lang.Object id معرّف_التقلّب
متغيرات النوع id معرّف_التقلّب
java.lang.String سلسلة NS* معرّف_التقلّب
java.lang.Number رقم NS* معرّف_التقلّب
java.lang.Cloneable نسخ NS* معرّف_التقلّب
foo.bar.Mmble FooBarMumble* معرّف_التقلّب
foo.bar.Mmber$Inner FooBarMumble_Inner* معرّف_التقلّب

الطُرق

تختلف طرق الهدف "ج" عن طرق جافا بطريقتين مهمتين. وهما مختلفان من حيث البنية، إذ يتم تضمين المعلمات بين مكوّنات أداة اختيار الطريقة. لا تتيح طرق الهدف ج التحميل الزائد كما هو الحال في جافا. ويتم حل هذه الاختلافات عن طريق تضمين أنواع المعلَمات في المحدِّد الذي يتم إنشاؤه. وهذا ضروري لمنع تعارض الأسماء بين طرق جافا المحملة بشكل زائد.

هناك ثلاثة أنواع من طرق جافا التي تختلف في واجهة برمجة التطبيقات التي تم إنشاؤها: طرق المثيل، والأساليب الثابتة، والدوال البرمجية. تُترجم طرق المثيل إلى طرق مثيلات الهدف ج. ويتم تحويل الطرق الثابتة وأدوات التصنيع إلى دوال ذات نمط C، ولكن تتم أيضًا إضافة برامج تضمين الهدف C لتقديم واجهة برمجة تطبيقات أكثر إلمامًا بمطوري الهدف ج.

طرق المثيلات

يتم إنشاء أسماء الطرق كما يلي:

  • لم يتم تغيير طرق المعلّمات.
  • تستخدم معلمة واحدة أو أكثر النمط التالي:
    • <java name>With<1st param keyword>:with<2nd param keyword>:with<3rd param keyword>:
  • قواعد الكلمة الرئيسية للمعلمة:
    • بالنسبة إلى الأنواع الأولية، الكلمة الرئيسية هي الاسم بالأحرف الكبيرة لأحرف جافا الأساسية. (مثال: "تشر"")
    • بالنسبة إلى الأنواع غير البدائية، تكون الكلمة الرئيسية هي اسم النوع المؤهل تمامًا والظريف للجمل. (مثال: "ComGoogleFoo"
    • بالنسبة إلى أنواع المصفوفة، يتم إلحاق "مصفوفة" بالكلمة الرئيسية لنوع العنصر.
مثال جافا
interface Foo {
  void bar();
  String bar(int i);
  java.util.List bar(String s, long[] l);
}
مثال للهدف ج
- (void)bar;

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

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

الطرق الثابتة

تتم إضافة طريقة فئة "الهدف ج" وفقًا لقواعد التسمية نفسها كطرق المثيلات.

تتم إضافة دالة نمط C باستخدام قواعد التسمية التالية:

  • ابدأ بأداة اختيار الهدف-C التي تم إنشاؤها. (مثال: barWithInt:)
  • استبدال الشرطات بشرطات سفلية. (مثال: barWithInt_)
  • أضِف اسمًا للفصل الدراسي، مع الفصل بينهما بشرطة سفلية. (مثال: ComGoogleFoo_barWithInt_)
مثال جافا
package com.google;
class Foo {
  static boolean bar() { ... }
  static double bar(int[] i) { ... }
  static void bar(String s, boolean b) { ... }
}
مثال للهدف ج
@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_ كائنًا تم الاحتفاظ به.
مثال جافا
package com.google;
class Foo {
  Foo() { ... }
  Foo(Object a, Object b) { ... }
}
مثال للهدف ج
@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);

الحقول

الحقول الافتراضية (غير الثابتة)

تصبح متغيرات مثيل جافا من متغيرات مثيل GOAL-C. ويتطابق الاسم مع شرطة سفلية. الحقول البدائية المعلنة على أنها "نهائية" هي حالة خاصة ولا تتم ترجمتها إلى متغيرات افتراضية.

  • يمكن الوصول إلى الحقول مباشرةً باستخدام بنية "->".
  • يمكن تعيين الحقول الأساسية مباشرة.
    • تتم ترجمة الوحدات الأولية الأولية (الثوابت) على أنها ثوابت ثابتة. (راجع الحقول الثابتة)
  • يجب ضبط الحقول غير الأولية باستخدام دالة setter المقدَّمة:
    • ClassName_set_fieldName_(instance, value)
مثال جافا
package com.google;
class Foo {
  public int myInt;
  public String myString;
}
مثال للهدف ج
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");

الحقول الثابتة

يجب الوصول إلى المتغيرات الثابتة باستخدام الدالّة getter وsetter. تضمن دوال الموصّل هذه إجراء إعداد الفئة قبل الوصول إلى المتغيّر.

  • الوصول إلى حقل ثابت
    • ClassName_get_fieldName()
  • تحديد حقل ثابت (غير نهائي)
    • ClassName_set_fieldName()
  • الحصول على مؤشر لحقل ثابت أساسي
    • ClassName_getRef_fieldName()
    • متاحة فقط للحقول غير النهائية وغير المتطايرة.

يمكن الوصول إلى الحقول الأولية الأولية (الثوابت) بشكل مباشر لأن قيمتها لا تعتمد على إعداد الصف.

  • ClassName_fieldName
مثال جافا
package com.google;
class Foo {
  public static final MY_FINAL_INT = 5;
  public static int myInt;
  public static String myString;
}
مثال للهدف ج
// 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");

عمليات التعداد

تنشئ J2ObjC نوعين لكل تعداد جافا. يتم إنشاء نوع الفئة "الهدف ج"، والذي يوفر الوظائف الكاملة لإحصاء جافا. بالإضافة إلى ذلك، يتم إنشاء تعداد C باستخدام وحدة ماكرو NS_ENUM لإطار العمل. تستخدم جميع واجهات برمجة التطبيقات التي تم إنشاؤها نوع الفئة "الهدف ج". يعد تعداد C مفيدًا كقيم ثابتة لبيان التبديل أو كنوع تخزين.

تتم تسمية أنواع التعداد التي تم إنشاؤها على النحو التالي:

  • تتم تسمية فئة Goal-C باستخدام القاعدة نفسها المستخدمة في فئة جافا العادية. (راجع الأنواع)
  • تتم تسمية التعداد C كفئة جافا عادية مع إضافة لاحقة "_Enum".

ويتم الوصول إلى الثوابت الثابتة مثل الحقول الثابتة.

مثال جافا
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);