Źródła tłumaczeń

Typ

  • W przypadku typów podstawowych J2ObjC ma zdefiniowane typy typów w formacie JNI.
  • W przypadku typowych typów zajęć pakiet jest zapisany wielką literą i dołączony do nazwy zajęć.
  • W przypadku podstawowego typu obiektu i wszystkich zmiennych typu używany jest „id”.
  • Kilka podstawowych typów Java jest mapowanych na typy fundamentów. (np. String (ciąg znaków) do NSString)
  • W przypadku pól deklarowanych jako „zmienne” J2ObjC ma więcej definicji typu korzystających z typów C11 _Atomic(...).
  • W przypadku typów wewnętrznych nazwa klasy wewnętrznej jest dodawana z podkreśleniem.
Typ Java Typ celu C Typ zmiennych: cel C
wartość logiczna Jwartość wartość_logiczna
znak Jchar _charakterystyczny_jchar
bajt JB _bajt_wolny
krótki krótka zmiennoprzecinkowy_jshort
int, dzong porcja_zniekształcona
długi Jlong zmiennoprzecinkowy_jlong
liczba zmiennoprzecinkowa Jpływający zmienna_zmienna
liczba zmiennoprzecinkowa dwójka zmiennoprzecinkowy_podwójny
java.lang.Object id identyfikator_zmiennej
zmienne typu id identyfikator_zmiennej
java.lang.String NSString*, identyfikator_zmiennej
java.lang.Number NSNumber* identyfikator_zmiennej
java.lang.Cloneable NSKopiowanie* identyfikator_zmiennej
foo.bar.Wyłącz FooBarMumble* identyfikator_zmiennej
foo.bar.Mumber$Inner FooBarMumble_Inner*, identyfikator_zmiennej

Metody

Istnieją 2 ważne sposoby metod stosowanych w celach C. Różnią się one składniowo, co pozwala umieszczać parametry między komponentami selektora metody. Metody celu C nie obsługują przeciążania, podobnie jak Java. Różnice te można rozwiązać, umieszczając typy parametrów w wygenerowanym selektorze. Jest to konieczne, aby uniknąć konfliktów nazw między przeciążonymi metodami Java.

Istnieją 3 typy metod Java, które różnią się w wygenerowanym interfejsie API: metody instancji, metody statyczne i konstruktory. Metody instancji są przekształcane w metody instancji celu C. Metody i konstruktory statyczne przekładają się na funkcje w stylu C, ale dodają też otoki Goal-C, aby umożliwić programistom korzystanie z bardziej znanego interfejsu API.

Metody instancji

Nazwy metod są generowane w ten sposób:

  • Metody zerowy nie zmieniają się
  • Co najmniej 1 parametr używa tego wzorca:
    • <java name>With<1st param keyword>:with<2nd param keyword>:with<3rd param keyword>:
  • Reguły słów kluczowych dotyczące parametrów:
    • W przypadku typów podstawowych słowo kluczowe jest pisane wielką literą w przypadku tych elementów. (np. „Char”)
    • W przypadku innych typów słów kluczowych słowo to będzie pełne i jednoznaczne. (np. „ComGoogleFoo”).
    • W przypadku typów tablic do słowa kluczowego typu elementu jest dołączana „tablica”.
Przykładowy Java
interface Foo {
  void bar();
  String bar(int i);
  java.util.List bar(String s, long[] l);
}
Przykładowy cel C
- (void)bar;

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

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

Metody statyczne

Metoda klasy Goal-C jest dodawana zgodnie z tymi samymi regułami nazewnictwa co metody instancji.

Funkcja stylu C jest dodawana za pomocą następujących reguł nazewnictwa:

  • Zacznij od wygenerowanego selektora celu C. (np. barWithInt:)
  • Zastąp dwukropki znakami podkreślenia. (np. barWithInt_)
  • Na początku nazwy zajęć umieść znak podkreślenia. (np. ComGoogleFoo_barWithInt_)
Przykładowy Java
package com.google;
class Foo {
  static boolean bar() { ... }
  static double bar(int[] i) { ... }
  static void bar(String s, boolean b) { ... }
}
Przykładowy cel 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ą cel-C została dodana metoda instancji init. Jeśli konstruktor ma parametry, stosowana jest ta sama reguła nazewnictwa co metody instancji.

Dodaliśmy 3 funkcje stylu C:

  • Pierwsza funkcja przyjmie jako nowo przydany nowo przypisany obiekt. Ta funkcja jest zwykle używana do wywoływania z konstruktora podklasy. Obowiązują te same reguły nazw co w przypadku metod statycznych. (gdzie „init” to nazwa metody)
  • Dodaliśmy dwie funkcje, które przydzielą i zainicjują nowy obiekt. Można je rozpoznać po prefiksie:
    • Funkcja create_ zwróci automatycznie zwolniony obiekt.
    • Funkcja new_ zwróci zwrócony obiekt.
Przykładowy Java
package com.google;
class Foo {
  Foo() { ... }
  Foo(Object a, Object b) { ... }
}
Przykładowy cel 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 (nie statyczne)

Zmienne instancji Java staną się zmiennymi celu C. Nazwa jest taka sama jak na końcu. Pola podstawowe zadeklarowane jako „ostateczne” to specjalny przypadek i nie są one przekształcane na zmienne instancji.

  • Dostęp do pól można uzyskać bezpośrednio przy użyciu składni „->”.
  • Pola podstawowe można ustawić bezpośrednio.
    • Końcówki podstawowe (stałe) są przekształcane w stałe statyczne. (zobacz Pola statyczne).
  • Pola inne niż podstawowe muszą być ustawione za pomocą udostępnionej funkcji ustawiania:
    • ClassName_set_fieldName_(instance, value)
Przykładowy Java
package com.google;
class Foo {
  public int myInt;
  public String myString;
}
Przykładowy cel 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 należy uzyskiwać za pomocą dostępnych funkcji getter i seter. Dzięki tym funkcjom dostępu inicjacja klasy rozpoczęła się przed uzyskaniem dostępu do zmiennej.

  • Otwórz pole statyczne
    • ClassName_get_fieldName()
  • Przypisz (niefinalizowane) pole statyczne
    • ClassName_set_fieldName()
  • Uzyskiwanie wskaźnika do podstawowego pola statycznego
    • ClassName_getRef_fieldName()
    • Ta opcja jest dostępna tylko w przypadku pól niefinalnych i nieulotnych.

Końcowe pola podstawowe (stałe) są dostępne bezpośrednio, ponieważ ich wartość nie zależy od inicjowania klasy.

  • ClassName_fieldName
Przykładowy Java
package com.google;
class Foo {
  public static final MY_FINAL_INT = 5;
  public static int myInt;
  public static String myString;
}
Przykładowy cel 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żdego wyliczenia Java. Wygenerowany jest typ klasy Goal-C, który zapewnia pełną funkcjonalność wyliczenia Java. Dodatkowo generowana jest en C C za pomocą makra NS_ENUM platformy Podstawy. Typ klasy Goal-C jest używany przez wszystkie wygenerowane interfejsy API. Wartość w polu C jest przydatna jako wartość stała dla instrukcji przełącznika lub typ pamięci masowej.

Wygenerowane typy wyliczenia mają te nazwy:

  • Nazwa klasy celu C ma taką samą regułę jak zwykła klasa w języku Java. (zobacz Typy).
  • Nazwa w formacie c jest przypisana do zwykłej klasy Java z dodanym sufiksem „_Enum”.

Stałe liczby cząstkowej są dostępne tak jak pola statyczne.

Przykładowy Java
package com.google;
enum Color {
  RED, GREEN, BLUE
}
Przykładowy nagłówek Goal-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);