Źródła tłumaczeń

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.
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);