مرجع الترجمة

الأنواع

  • بالنسبة إلى الأنواع الأولية، حدّد J2ObjC تعريفات الكتابة بنمط JNI.
  • وبالنسبة إلى أنواع الفئات النموذجية، تكون الحزمة مكتوبة بأحرف كبيرة وتُضاف إلى اسم الفئة.
  • بالنسبة إلى نوع الكائن الأساسي وجميع متغيرات النوع، "id" استخدام المشروع.
  • يتم ربط بعض أنواع Java الأساسية بأنواع البيانات الأساسية. (مثال: سلسلة إلى NSString)
  • بالنسبة إلى الحقول المُعلَن عنها "متقلبة"، يحتوي J2ObjC على المزيد من تعريفات الأنواع التي تستخدم أنواع C11 _Atomic(...).
  • بالنسبة إلى الأنواع الداخلية، يتم إلحاق اسم الفئة الداخلية بالاسم الخارجي بشرطة سفلية.
نوع Java نوع الهدف-ج نوع البيانات المتقلبة Objective-C
منطقي jboolean volatile_jboolean
حرف جشار volatile_jchar
بايت جيبايت volatile_jbyte
فيديو قصير jshort volatile_jshort
int جنت volatile_jint
طويلة جلونغ volatile_jlong
عدد عائم jfloat volatile_jfloat
مزدوج جدبل volatile_jdouble
java.lang.Object id volatile_id
متغيرات الأنواع id volatile_id
java.lang.String NSString* volatile_id
java.lang.Number NSNumber* volatile_id
java.lang.Cloneable نسخ NS* volatile_id
foo.bar.Mumble FooBarMumble* volatile_id
foo.bar.Mumber$Inner FooBarMumble_Inner* volatile_id

الطُرق

تختلف طرق Objective-C عن طرق Java بطريقتين مهمتين. إنها من الناحية التركيبية ، مع تضمين المعلمات بين مكونات محدد الطريقة. الهدف-ج الأخرى التحميل الزائد كما تفعل Java. ويتم حل هذه الاختلافات بتضمين أنواع المعلَمات في أداة الاختيار التي تم إنشاؤها. ويُعد ذلك ضروريًا لمنع تعارض الأسماء بين طرق Java المحملة بشكل زائد.

هناك ثلاثة أنواع من طرق Java تختلف في واجهة برمجة التطبيقات التي تم إنشاؤها: طرق المثيلات، والثابتة والطرق والمنصات الإنشائية. تُترجم طرق المثيلات إلى طرق مثيلات الهدف -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);
}
مثال على الهدف-ج
- (void)bar;

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

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

طرق ثابتة

تتم إضافة طريقة الفئة Objective-C باتباع قواعد التسمية نفسها كطرق المثيلات.

تتم إضافة دالة النمط 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) { ... }
}
مثال على الهدف-ج
@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. إذا كانت الدالة الإنشائية تضم الأخرى، فسيتم استخدام نفس قاعدة التسمية مثل طرق المثيلات.

تتم إضافة ثلاث دوال من النمط C:

  • تقبل الدالة الأولى كائنًا مخصصًا حديثًا كمعاملته الأولى. هذه الدالة هي يُستخدم عادةً لاستدعاء الدالة الإنشائية لفئة فرعية. يتبع هذا نفس قواعد التسمية مثل الثابتة الطرق. (حيث يكون "init" هو اسم الطريقة)
  • تتم إضافة دالتين لتخصيص الكائن الجديد وتهيئته. يمكن تمييزهما حسب بادئتهم:
    • ستعرض الدالة create_ كائنًا تم طرحه تلقائيًا.
    • ستعرض الدالة new_ عنصرًا تم الاحتفاظ به.
مثال على Java
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);

الحقول

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

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

  • يمكن الوصول إلى الحقول مباشرةً باستخدام "->" وبناء الجملة.
  • يمكن تعيين الحقول الأساسية مباشرة.
    • تتم ترجمة الأساسيات النهائية (الثوابت) مثل الثوابت الثابتة. (راجِع الحقول الثابتة)
  • يجب ضبط الحقول غير الأساسية باستخدام دالة setter المقدّمة:
    • ClassName_set_fieldName_(instance, value)
مثال على Java
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
مثال على Java
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 نوعين لكل تعداد Java. يتم إنشاء نوع فئة Intent-C والذي يوفر الوظائف الكاملة لتعداد Java. بالإضافة إلى ذلك، يتم إنشاء تعداد C باستخدام دالة ماكرو NS_ENUM لإطار العمل. تستخدم جميع واجهات برمجة التطبيقات التي تم إنشاؤها نوع الفئة Objective-C. تعداد C مفيدة كقيم ثابتة لجملة تبديل، أو كنوع تخزين.

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

  • تتم تسمية فئة Objective-C باستخدام نفس القاعدة كفئة Java عادية. (يمكنك الاطّلاع على الأنواع)
  • تتم تسمية التعداد C كفئة 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);