انواع
- برای انواع اولیه، J2ObjC تایپهای سبک JNI را تعریف کرده است.
- برای انواع کلاس های معمولی، بسته به شکل شتری است و به نام کلاس اضافه می شود.
- برای تغییر نام پیشوند بسته تولید شده به پیشوندهای بسته مراجعه کنید.
- برای نوع Object پایه و همه متغیرهای نوع، "id" استفاده می شود.
- چند نوع اصلی جاوا به انواع پایه نگاشت شده است. (به عنوان مثال، رشته به NSString)
- برای فیلدهایی که "فرار" اعلام شده اند، J2ObjC دارای typedef های بیشتری است که از انواع C11 _Atomic(...) استفاده می کنند.
- برای انواع داخلی، نام کلاس داخلی با یک خط زیر به نام بیرونی اضافه می شود.
نوع جاوا | نوع Objective-C | Objective-C نوع فرار |
---|---|---|
بولی | jboolean | volatile_jboolean |
کاراکتر | jchar | volatile_jchar |
بایت | jbyte | volatile_jbyte |
کوتاه | jshort | volatile_jshort |
بین المللی | جنت | volatile_jint |
طولانی | jlong | volatile_jlong |
شناور | jfloat | volatile_jfloat |
دو برابر | jdoble | volatile_jdouble |
java.lang.object | شناسه | volatile_id |
متغیرها را تایپ کنید | شناسه | volatile_id |
java.lang.string | NSString* | volatile_id |
java.lang.شماره | شماره NS* | volatile_id |
java.lang.Cloneable | NSCopying* | volatile_id |
foo.bar.Mumble | FooBarMumble* | volatile_id |
foo.bar.Mumber$Inner | FooBarMumble_Inner* | volatile_id |
مواد و روش ها
متدهای Objective-C از دو جهت مهم با متدهای جاوا تفاوت دارند. آنها از نظر نحوی متفاوت هستند و پارامترها را در بین اجزای انتخابگر متد تعبیه می کنند. روش های Objective-C مانند جاوا از بارگذاری بیش از حد پشتیبانی نمی کنند. این تفاوت ها با تعبیه انواع پارامتر در انتخابگر تولید شده حل می شود. این برای جلوگیری از برخورد نام بین متدهای جاوای بارگذاری شده ضروری است.
سه نوع روش جاوا وجود دارد که در API تولید شده با هم متفاوت هستند: روشهای نمونه، روشهای استاتیک و سازندهها. روشهای نمونه به روشهای نمونه Objective-C ترجمه میشوند. روشها و سازندههای استاتیک به توابع به سبک C ترجمه میشوند، اما بستهبندیهای Objective-C را نیز اضافه میکنند تا یک API آشناتر برای توسعهدهندگان Objective-C فراهم کنند.
روش های نمونه
نام روش ها به صورت زیر تولید می شود:
- روش های پارامتر صفر بدون تغییر هستند
- یک یا چند پارامتر از الگوی زیر استفاده می کند:
-
<java name>With<1st param keyword>:with<2nd param keyword>:with<3rd param keyword>:
-
- قوانین کلمه کلیدی پارامتر:
- برای انواع ابتدایی، کلمه کلیدی نام اصلی جاوا است. (به عنوان مثال "شار")
- برای انواع غیر ابتدایی، کلمه کلیدی نام نوع کاملاً واجد شرایط شتر است. (به عنوان مثال "ComGoogleFoo")
- برای انواع آرایه، "Array" به کلمه کلیدی نوع عنصر اضافه می شود.
به عنوان مثال جاوا
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;
روش های استاتیک
یک متد کلاس Objective-C به دنبال قوانین نامگذاری مشابه با متدهای نمونه اضافه می شود.
یک تابع سبک C با استفاده از قوانین نامگذاری زیر اضافه می شود:
- با انتخابگر Objective-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) { ... }
}
مثال هدف-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
اضافه می شود. اگر سازنده دارای پارامترهایی باشد، از همان قانون نامگذاری به عنوان متدهای نمونه استفاده می شود.
سه تابع سبک C اضافه شده است:
- تابع اول یک شی جدید تخصیص داده شده را به عنوان اولین پارامتر خود می پذیرد. این تابع معمولاً برای فراخوانی از سازنده زیر کلاس استفاده می شود. این از قوانین نامگذاری مشابه روشهای استاتیک پیروی می کند. (که در آن "init" نام روش است)
- دو تابع اضافه شده است که شی جدید را تخصیص و مقداردهی اولیه می کند. آنها با پیشوند خود متمایز می شوند:
- تابع
create_
یک شیء آزاد شده را برمی گرداند. - تابع
new_
یک شیء حفظ شده را برمی گرداند.
- تابع
به عنوان مثال جاوا
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);
زمینه های
فیلدهای نمونه (غیر ایستا)
متغیرهای نمونه جاوا به متغیرهای نمونه Objective-C تبدیل می شوند. این نام با خط زیرین یکسان است. فیلدهای اولیه اعلام شده "نهایی" یک مورد خاص هستند و به متغیرهای نمونه ترجمه نمی شوند.
- با استفاده از نحو "->" می توان مستقیماً به فیلدها دسترسی داشت.
- فیلدهای اولیه را می توان مستقیماً تنظیم کرد.
- اولیه های نهایی (ثابت) مانند ثابت های ثابت ترجمه می شوند. (به فیلدهای استاتیک مراجعه کنید)
- فیلدهای غیر ابتدایی باید با استفاده از تابع تنظیم کننده ارائه شده تنظیم شوند:
-
ClassName_set_fieldName_(instance, value)
-
به عنوان مثال جاوا
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
به عنوان مثال جاوا
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 برای هر enum جاوا دو نوع تولید می کند. یک نوع کلاس Objective-C تولید می شود که عملکرد کامل یک enum جاوا را ارائه می دهد. علاوه بر این، یک عدد C با استفاده از ماکرو NS_ENUM چارچوب بنیاد ایجاد میشود. نوع کلاس Objective-C توسط همه APIهای تولید شده استفاده می شود. C enum به عنوان مقادیر ثابت برای یک دستور سوئیچ یا به عنوان یک نوع ذخیره سازی مفید است.
انواع enum تولید شده به صورت زیر نامگذاری می شوند:
- کلاس Objective-C با استفاده از قانون یک کلاس جاوای معمولی نامگذاری شده است. (به انواع مراجعه کنید)
- C enum به عنوان یک کلاس جاوای معمولی با پسوند "_Enum" اضافه شده است.
ثابت های Enum مانند فیلدهای استاتیک قابل دسترسی هستند.
به عنوان مثال جاوا
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);