Typy
- W przypadku typów podstawowych J2ObjC ma zdefiniowane ustawienia typów w stylu JNI.
- W przypadku typowych klas klasa jest zabezpieczona skrzydłem wielbłąda, a jej nazwa jest dołączona do nazwy zajęć.
- Aby zmienić nazwę wygenerowanego prefiksu pakietu, przeczytaj sekcję Prefiksy pakietu.
- W przypadku podstawowego typu obiektu i zmiennych typu „id” i zgody na określone zastosowania ich danych.
- Kilka podstawowych typów Javy jest zmapowanych na typy podstawowych. (np. ciąg znaków do NSString)
- W przypadku pól zadeklarowanych jako „volatile” J2ObjC ma więcej definicji typu typedef, które korzystają z typów C11 _Atomic(...).
- W przypadku typów wewnętrznych nazwa klasy wewnętrznej jest dodawana do nazwy zewnętrznej z podkreśleniem.
Typ Javy | Typ Objective-C | Typ zmiennej Objective-C |
---|---|---|
wartość logiczna | jboolean, | volatile_jboolean |
znak | Jchar | volatile_jchar |
bajt | jbajt | volatile_jbyte |
krótki | Jshort | volatile_jshort |
int, | Jint | volatile_jint |
Liczba długa | Jlong | volatile_jlong |
liczba zmiennoprzecinkowa | jfloat | volatile_jfloat |
double, | jdouble | volatile_jdouble |
java.lang.Object | id | volatile_id |
Typ zmiennych | id | volatile_id |
java.lang.String | NSString* | volatile_id |
java.lang.Number | NSNumber*, | volatile_id |
java.lang.Cloneable | NSCopying*, | volatile_id |
foo.bar.Mumble | FooBarMumble*, | volatile_id |
foo.bar.Mumber$Inner | FooBarMumble_Inner* | volatile_id |
Metody
Metody Objective-C różnią się od metod w Javie 2 istotnymi aspektami. Mają składnię umieszczając parametry między komponentami selektora metody. Objective-C nie obsługują przeciążania w taki sposób, jak ma to miejsce w przypadku Javy. Różnice te można zniwelować, umieszczając do wygenerowanego selektora. Jest to konieczne, aby zapobiec konfliktom nazw między z przeciążonymi metodami Java.
Istnieją trzy rodzaje metod Java, które różnią się w wygenerowanym interfejsie API: metody instancji, statyczne metody i konstruktory. Metody instancji przekładają się na metody instancji Objective-C. Statyczna które pozwalają uzyskać funkcje w stylu C, ale także dodają kody Objective-C do udostępnić bardziej znany interfejs API programistom Objective-C.
Metody instancji
Nazwy metod są generowane w ten sposób:
- Metody zerowe pozostaną niezmienione
- Co najmniej 1 parametr wykorzystuje ten wzorzec:
<java name>With<1st param keyword>:with<2nd param keyword>:with<3rd param keyword>:
- Reguły słów kluczowych z parametrem:
- W przypadku typów podstawowych słowo kluczowe to pisana wielkimi literami nazwa prostego typu Java. (np. „Char”)
- W przypadku typów innych niż podstawowe słowem kluczowym jest w pełni kwalifikowana nazwa typu z wielkich liter wielbłąda. (np. „ComGoogleFoo”)
- W przypadku typów tablic – „tablica” jest dołączany do słowa kluczowego tego typu.
Przykładowa Java
interface Foo {
void bar();
String bar(int i);
java.util.List bar(String s, long[] l);
}
Przykład Objective-C
- (void)bar;
- (NSString *)barWithInt:(jint)i;
- (id<JavaUtilList>)barWithNSString:(NSString *)s
withLongArray:(IOSLongArray *)l;
Metody statyczne
Dodano metodę klasy Objective-C zgodnie z tymi samymi regułami nazewnictwa co metody instancji.
Funkcja w stylu C jest dodawana przy użyciu następujących reguł nazewnictwa:
- Zacznij od wygenerowanego selektora Objective-C. (np.
barWithInt:
) - Zastąp dwukropki podkreśleniami. (np.
barWithInt_
) - Dołącz nazwę klasy oddzieloną znakiem podkreślenia na początku. (np.
ComGoogleFoo_barWithInt_
)
Przykładowa Java
package com.google;
class Foo {
static boolean bar() { ... }
static double bar(int[] i) { ... }
static void bar(String s, boolean b) { ... }
}
Przykład Objective-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);
Zespoły
Zgodnie z konwencją Objective-C dodajemy metodę instancji init
. Jeśli konstruktor ma
, stosowana jest ta sama reguła nazewnictwa co w metodach instancji.
Dodano 3 funkcje w stylu C:
- Pierwsza funkcja akceptuje nowo przydzielony obiekt jako pierwszy parametr. Ta funkcja jest zwykle używany do wywoływania z konstruktora podklasy. Obowiązują te same reguły nazewnictwa co w przypadku plików statycznych. . (gdzie „init” to nazwa metody)
- Dodane zostaną 2 funkcje, które przydzielą i zainicjują nowy obiekt. Wyróżniamy się
według prefiksu:
- Funkcja
create_
zwróci automatycznie zwolniony obiekt. - Funkcja
new_
zwraca zachowany obiekt.
- Funkcja
Przykładowa Java
package com.google;
class Foo {
Foo() { ... }
Foo(Object a, Object b) { ... }
}
Przykład Objective-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);
Pola
Pola instancji (niestatyczne)
Zmienne instancji Java stają się zmiennymi instancji Objective-C. Nazwa jest taka sama, jak na końcu podkreślenie. Pola podstawowe zadeklarowane jako „final” są szczególnym przypadkiem i nie są przekształcane na instancje zmiennych.
- Dostęp do pól można uzyskać bezpośrednio za pomocą „->” składni.
- Pola podstawowe można ustawić bezpośrednio.
- Końcowe podstawowe elementy podstawowe (stałe) są przekształcane tak jak stałe statyczne. (patrz Pola statyczne)
- Pola inne niż podstawowe należy ustawić za pomocą podanej funkcji ustawiającej:
ClassName_set_fieldName_(instance, value)
Przykładowa Java
package com.google;
class Foo {
public int myInt;
public String myString;
}
Przykład Objective-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");
Pola statyczne
Dostęp do zmiennych statycznych można uzyskać za pomocą podanych funkcji pobierania i ustalania. Te funkcje dostępu zapewniają zainicjowanie klasy przed uzyskaniem dostępu do zmiennej.
- Dostęp do pola statycznego
ClassName_get_fieldName()
- Przypisz pole statyczne, które nie jest ostateczne
ClassName_set_fieldName()
- Uzyskiwanie wskaźnika do podstawowego pola statycznego
ClassName_getRef_fieldName()
- Dostępna tylko w przypadku pól nieostatecznych i nieumiennych.
Końcowe pola podstawowe (stałe) można bezpiecznie uzyskiwać bezpośrednio, ponieważ ich wartość nie zależy od inicjowania klasy.
ClassName_fieldName
Przykładowa Java
package com.google;
class Foo {
public static final MY_FINAL_INT = 5;
public static int myInt;
public static String myString;
}
Przykład Objective-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");
Wartości w polu enum
J2ObjC generuje 2 typy dla każdej wyliczenia Java. Wygenerowany jest typ klasy Objective-C, który zapewnia pełną funkcjonalność wyliczenia w Javie. Dodatkowo enum jest generowane przy użyciu wartości Fundamenty. NS_ENUM platformy. Typ klasy Objective-C jest używany przez cały wygenerowany interfejs API. Wartość C enum to mogą być używane jako stałe wartości w instrukcji Switch lub jako typ pamięci masowej.
Wygenerowane typy wyliczeniowych mają takie nazwy:
- Nazwa klasy Objective-C jest taka sama jak w przypadku zwykłej klasy Java. (zobacz Typy).
- C enum ma nazwę zwykłej klasy Java z dodanym „_Enum” przedrostek.
Stałe typu enum są używane jak pola statyczne.
Przykładowa Java
package com.google;
enum Color {
RED, GREEN, BLUE
}
Przykładowy nagłówek 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);