סוגים
- בטיפוסים פרימיטיביים, J2ObjC הגדירה ערכי typedefs בסגנון JNI.
- בסוגים טיפוסיים של מחלקות, החבילה כוללת אותיות קמל ומוצמדת לשם המחלקה.
- כדי לשנות את השם של קידומת החבילה שנוצרה, ראו קידומות של חבילה.
- לסוג אובייקט הבסיס ולכל משתני הסוג, 'id' נעשה שימוש.
- כמה סוגי ליבה של Java ממופים לסוגי היסודות. (למשל: מחרוזת אל NSString)
- בשדות שהוצהרו כ'תנודתיים', ל-J2ObjC יש יותר הגדרות typedef שמשתמשות בסוגי Atomic(...) C11 _Atomic(...).
- בהקלדה פנימית, שם המחלקה הפנימית מצורף לשם החיצוני עם קו תחתון.
סוג Java | סוג Objective-C | סוג תנודתי של Objective-C |
---|---|---|
בוליאני | ג'בוליאני | volatile_jboolean |
תו | Jchar | volatile_jchar |
בייט | jbyte | volatile_jbyte |
סרטון קצר | Jshort | volatile_jshort |
int | Jint | volatile_jint |
long | Jlong | volatile_jlong |
מספר ממשי (float) | jfloat. | volatile_jfloat |
כפולה | Jdouble | volatile_jdouble |
JavaScript.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 בשתי דרכים חשובות. הם תחביריים שונה, ומטמיעים את הפרמטרים בין הרכיבים של בורר השיטות. יעד ג' ה-methods לא תומכות בעומס יתר כמו ב-Java. כדי לפתור את ההבדלים האלה אנחנו מטמיעים את של סוגי הפרמטרים לבורר שנוצר. הדבר נדרש כדי למנוע התנגשויות בין שמות עומס יתר על שיטות Java.
יש שלושה סוגים של שיטות Java השונות ב-API שנוצר שלהן: שיטות מכונה, סטטיות ומבנים. שיטות של מכונות מתורגמות ל-methods של מכונה Objective-C. סטטי שיטות ומבנים מתורגמים לפונקציות בסגנון C, אבל גם מוסיפים wrappers של אובייקט-C לספק API מוכר יותר למפתחי Objective-C.
שיטות של מכונה
שמות ה-method נוצרים באופן הבא:
- ללא שינוי ב-methods של אפס פרמטרים
- פרמטר אחד או יותר משתמשים בדפוס הבא:
<java name>With<1st param keyword>:with<2nd param keyword>:with<3rd param keyword>:
- כללי מילות מפתח בפרמטרים:
- בסוגים פרימיטיביים, מילת המפתח היא השם באותיות רישיות של רכיב Java. (למשל: 'צ'אר')
- בסוגים לא פרימיטיביים, מילת המפתח היא שם של טיפוס שמוגדר במלואו, כולל אותיות רישיות. (למשל: 'ComGoogleFoo')
- לסוגי מערכים, 'Array' מצורף למילת המפתח מסוג הרכיב.
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
. אם יש ל-constructor
, נעשה שימוש באותו כלל מתן שמות כמו בשיטות של מכונה.
נוספו שלוש פונקציות בסגנון C:
- הפונקציה הראשונה מקבלת אובייקט שהוקצה לאחרונה כפרמטר הראשון. הפונקציה הזו שמשמשים בדרך כלל לקריאה מבנאי של מחלקה משנית. מתן שמות לפי אותם כללים כמו שמות סטטיים שיטות. (כאשר 'init' הוא שם ה-method)
- נוספו שתי פונקציות שיקצו ויאתחלו את האובייקט החדש. הם ייחודיים
לפי הקידומת שלהם:
- הפונקציה
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");
טיפוסים בני מנייה (enum)
הפונקציה J2ObjC יוצרת שני סוגים לכל טיפוס Java אחד (enum). נוצר סוג מחלקה Objective-C שמספק את הפונקציונליות המלאה של enum ב-Java. בנוסף, נוצר טיפוס Cenum באמצעות הקרן NS_ENUM של framework. סוג המחלקה Objective-C משמש את כל ה-API שנוצר. הערך C enum הוא יכול להיות שימושי כערכים קבועים בהצהרת החלפה, או כסוג אחסון.
השמות של סוגי ה-enum שנוצרו הם:
- השם של המחלקה Objective-C כולל את אותו כלל כמו של מחלקה רגילה של Java. (מידע נוסף זמין בקטע סוגים)
- השם C enum הוא מחלקה רגילה של Java בתוספת ' _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);