Türler
- J2ObjC, basit türler için JNI stili typedef'leri tanımlamıştır.
- Tipik sınıf türlerinde paket büyük/küçük harfe duyarlıdır ve sınıf adının başına eklenir.
- Oluşturulan paket ön ekini yeniden adlandırmak için Paket Önekleri konusuna bakın.
- Temel Object type ve tüm tür değişkenler için "id" bu düzenlemelerin nedenlerinden biri.
- Birkaç temel Java türü temel türleriyle eşlenmiştir. (ör. Dizeden NSString'e)
- "Değişken" olarak tanımlanan alanlar için J2ObjC, C11 _Atomik(...) türlerini kullanan daha fazla typedef'e sahiptir.
- İç türlerde iç sınıf adı, dış adın sonuna alt çizgiyle eklenir.
Java türü | Hedef-C türü | Objective-C değişken türü |
---|---|---|
boolean | jboole | volatile_jboolean |
karakter | Jchar | volatile_jchar |
bayt | Jbayt | volatile_jbyte |
kısa video | jshort | volatile_jshort |
int | Jint | volatile_jint |
uzun | Jlong | volatile_jlong |
kayan noktalı | jfloat | volatile_jfloat |
double | Jdouble | volatile_jdouble |
Java.lang.Nesne | id | volatile_id |
tür değişkenleri | id | volatile_id |
java.lang.String | NSString* | volatile_id |
java.lang.Number | NSNumarası* | volatile_id |
java.lang.Cloneable | NSKopyalama* | volatile_id |
foo.bar.Mumble | FooBarMumble* | volatile_id |
foo.bar.Mumber$Inner | FooBarMumble_Inner* | volatile_id |
Yöntemler
Objective-C yöntemleri, Java yöntemlerinden iki önemli açıdan farklıdır. Sözdizimseldirler farklı yöntemler kullanarak parametreleri yöntem seçicinin bileşenleri arasına yerleştirebilirsiniz. Hedef-C yöntemleri Java gibi aşırı yüklemeyi desteklemez. Bu farklılıklar, parametre türlerini, oluşturulan seçicinin içine yerleştirin. Bu işlem, sayfa içi çakışmaları önlemek için olabilir.
Oluşturulan API'lerinde farklılık gösteren üç tür Java yöntemi vardır: örnek yöntemleri, statik ve oluşturucuları ele alacağız. Örnek yöntemleri, Objective-C örnek yöntemlerine dönüştürülür. Statik yöntemleri ve oluşturucuları C stili fonksiyonlara çevirir, ancak aynı zamanda Objective-C geliştiricilerine daha aşina olan bir API sağlama.
Örnek Yöntemleri
Yöntem adları şu şekilde oluşturulur:
- Hiçbir parametre yöntemi değiştirilmez
- Bir veya daha fazla parametre aşağıdaki kalıbı kullanıyor:
<java name>With<1st param keyword>:with<2nd param keyword>:with<3rd param keyword>:
- Parametre anahtar kelime kuralları:
- Temel türlerde anahtar kelime, Java temel öğesinin büyük harfle yazılmış adıdır. (ör. "Char")
- Temel olmayan türler için anahtar kelime, büyük/küçük harf içeren tam nitelikli tür adıdır. (ör. "ComGoogleFoo")
- Dizi türleri için "Dizi" anahtar kelimesi, öğe türündeki anahtar kelimeye eklenir.
Örnek Java
interface Foo {
void bar();
String bar(int i);
java.util.List bar(String s, long[] l);
}
Örnek Hedef-C
- (void)bar;
- (NSString *)barWithInt:(jint)i;
- (id<JavaUtilList>)barWithNSString:(NSString *)s
withLongArray:(IOSLongArray *)l;
Statik Yöntemler
Örnek yöntemleriyle aynı adlandırma kuralları izlenerek bir Objective-C sınıfı yöntemi eklenir.
C stili bir işlev, aşağıdaki adlandırma kuralları kullanılarak eklenir:
- Oluşturulan Objective-C seçiciyle başlayın. (ör.
barWithInt:
) - İki nokta üst üste işaretlerini alt çizgiyle değiştirin. (ör.
barWithInt_
) - Alt çizgiyle ayrılmış sınıf adını başa ekleyin. (ör.
ComGoogleFoo_barWithInt_
)
Örnek Java
package com.google;
class Foo {
static boolean bar() { ... }
static double bar(int[] i) { ... }
static void bar(String s, boolean b) { ... }
}
Örnek Hedef-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);
Markalar
Objective-C kuralının ardından bir init
örnek yöntemi eklenir. Oluşturucu
parametresinde olduğu gibi, örnek yöntemleriyle aynı adlandırma kuralı kullanılır.
C stilinde üç işlev eklenir:
- İlk işlev, yeni ayrılmış bir nesneyi ilk parametresi olarak kabul eder. Bu işlev genellikle bir alt sınıf oluşturucudan çağrı yapmak için kullanılır. Bu, statik ile aynı adlandırma kurallarını uygular yöntemlerine göz atın. (burada "init", yöntem adıdır)
- Yeni nesneyi ayıracak ve başlatacak iki işlev eklenir. Bunlar birbirinden farklı
öneklerine göre:
create_
işlevi, otomatik olarak yayınlanan bir nesneyi döndürür.new_
işlevi, saklanan bir nesneyi döndürür.
Örnek Java
package com.google;
class Foo {
Foo() { ... }
Foo(Object a, Object b) { ... }
}
Örnek Hedef-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);
Alanlar
Örnek Alanları (statik olmayan)
Java örneği değişkenleri, Objective-C örnek değişkenleri haline gelir. Ad, sonundaki ile aynı alt çizgi. Temel alanlar "nihai" olarak bildirildi özel bir durumdur ve örneğe çevrilmez. değişkenlerine karşılık gelir.
- Alanlara "->" kullanılarak doğrudan erişilebilir söz dizimine uygun olmalıdır.
- Temel alanlar doğrudan ayarlanabilir.
- Nihai temel değerler (sabit değerler), statik sabitler gibi çevrilir. (bkz. Statik Alanlar)
- Temel olmayan alanlar, sağlanan belirleyici işlevi kullanılarak ayarlanmalıdır:
ClassName_set_fieldName_(instance, value)
Örnek Java
package com.google;
class Foo {
public int myInt;
public String myString;
}
Örnek Hedef-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");
Statik Alanlar
Statik değişkenlere, sağlanan alıcı ve belirleyici işlevleri kullanılarak erişilmelidir. Bu erişimci işlevleri, değişkene erişilmeden önce sınıf ilk kullanıma hazırlamanın gerçekleşmesini sağlar.
- Statik bir alana erişme
ClassName_get_fieldName()
- (Nihai olmayan) bir statik alan atama
ClassName_set_fieldName()
- Temel bir statik alana işaretçi alma
ClassName_getRef_fieldName()
- Yalnızca nihai ve kalıcı olmayan alanlar için kullanılabilir.
Değerleri sınıf başlatmaya bağlı olmadığından nihai temel alanlara (sabit değerler) doğrudan erişmek güvenlidir.
ClassName_fieldName
Örnek Java
package com.google;
class Foo {
public static final MY_FINAL_INT = 5;
public static int myInt;
public static String myString;
}
Örnek Hedef-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");
Sıralamalar
J2ObjC, her bir Java sıralaması için iki tür oluşturur. Aşağıdaki gibi bir Objective-C sınıf türü oluşturulur: tam işlevsellik katmak istiyorum. Ayrıca, Temel kullanılarak bir C sıralaması oluşturulur çerçevenin NS_ENUM makrosu. Objective-C sınıf türü, oluşturulan tüm API tarafından kullanılır. C sıralaması veya depolama türü olarak kullanabilirsiniz.
Oluşturulan enum türleri şu şekilde adlandırılır:
- Objective-C sınıfı, normal bir Java sınıfıyla aynı kural kullanılarak adlandırılır. (Türler konusuna bakın)
- C sıralaması, "_Enum" ekiyle normal bir Java sınıfı olarak adlandırılır soneki kullanmanız gerekir.
Enum sabitlerine statik alanlar gibi erişilir.
Örnek Java
package com.google;
enum Color {
RED, GREEN, BLUE
}
Örnek Objective-C Başlığı
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);