Типы
- Для примитивных типов J2ObjC определил определения типов в стиле JNI.
- Для типичных типов классов пакет имеет верблюжий регистр и добавляется к имени класса.
- Чтобы переименовать сгенерированный префикс пакета, см. «Префиксы пакетов» .
- Для базового типа объекта и всех переменных типа используется «id».
- Несколько основных типов Java сопоставлены с базовыми типами. (например, строка в NSString)
- Для полей, объявленных «изменчивыми», J2ObjC имеет больше определений типов, которые используют типы C11 _Atomic(...).
- Для внутренних типов имя внутреннего класса добавляется к внешнему имени с помощью подчеркивания.
Тип Java | Тип цели-C | Независимый тип Objective-C |
---|---|---|
логическое значение | jboolean | Летучий_jboolean |
голец | Джчар | Летучий_jchar |
байт | jbyte | Летучий_jbyte |
короткий | jshort | Летучий_jshort |
интервал | шутка | летучий_джинт |
длинный | Джлонг | Летучий_jlong |
плавать | jfloat | летучий_jfloat |
двойной | jdouble | летучий_jdouble |
java.lang.Объект | идентификатор | Летучий_ид |
тип переменных | идентификатор | Летучий_ид |
java.lang.String | NSString* | Летучий_ид |
java.lang.Номер | НСНомер* | Летучий_ид |
java.lang.Cloneable | НСКопирование* | Летучий_ид |
foo.bar.Mumble | FooBarMumble* | Летучий_ид |
foo.bar.Mumber$Inner | FooBarMumble_Inner* | Летучий_ид |
Методы
Методы Objective-C отличаются от методов Java двумя важными моментами. Они синтаксически различны: параметры встраиваются между компонентами селектора метода. Методы Objective-C не поддерживают перегрузку, как это делает Java. Эти различия устраняются путем внедрения типов параметров в сгенерированный селектор. Это необходимо для предотвращения конфликтов имен между перегруженными методами Java.
Существует три типа методов Java, которые различаются созданным API: методы экземпляра, статические методы и конструкторы. Методы экземпляра преобразуются в методы экземпляра Objective-C. Статические методы и конструкторы преобразуются в функции в стиле C, а также добавляют оболочки Objective-C, чтобы предоставить разработчикам Objective-C более знакомый API.
Методы экземпляра
Имена методов генерируются следующим образом:
- Методы с нулевым параметром не изменились.
- Один или несколько параметров используют следующий шаблон:
-
<java name>With<1st param keyword>:with<2nd param keyword>:with<3rd param keyword>:
-
- Правила ключевых слов параметров:
- Для примитивных типов ключевым словом является имя примитива Java, написанное с заглавной буквы. (например, «Чар»)
- Для непримитивных типов ключевым словом является полное имя типа с верблюжьим регистром. (например, «ComGoogleFoo»)
- Для типов массивов к ключевому слову типа элемента добавляется «Массив».
Пример Java
interface Foo {
void bar();
String bar(int i);
java.util.List bar(String s, long[] l);
}
Пример Objective-C
- (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) { ... }
}
Пример 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);
Конструкторы
В соответствии с соглашением Objective-C добавляется метод экземпляра init
. Если у конструктора есть параметры, используется то же правило именования, что и для методов экземпляра.
Добавлены три функции в стиле C:
- Первая функция принимает вновь выделенный объект в качестве своего первого параметра. Эта функция обычно используется для вызова из конструктора подкласса. Это следует тем же правилам именования, что и статические методы. (где «init» — имя метода)
- Добавляются две функции, которые будут выделять и инициализировать новый объект. Они отличаются префиксом:
- Функция
create_
вернет автоматически выпущенный объект. - Функция
new_
вернет сохраненный объект.
- Функция
Пример Java
package com.google;
class Foo {
Foo() { ... }
Foo(Object a, Object b) { ... }
}
Пример 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);
Поля
Поля экземпляра (нестатические)
Переменные экземпляра Java становятся переменными экземпляра Objective-C. Имя такое же, но заканчивается подчеркиванием. Примитивные поля, объявленные «финальными», представляют собой особый случай и не преобразуются в переменные экземпляра.
- Доступ к полям можно получить напрямую, используя синтаксис «->».
- Примитивные поля можно задать напрямую.
- Конечные примитивы (константы) переводятся как статические константы. (см. Статические поля )
- Непримитивные поля должны быть установлены с использованием предоставленной функции установки:
-
ClassName_set_fieldName_(instance, value)
-
Пример Java
package com.google;
class Foo {
public int myInt;
public String myString;
}
Пример 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");
Статические поля
Доступ к статическим переменным должен осуществляться с использованием предусмотренных функций получения и установки. Эти функции доступа гарантируют, что инициализация класса произошла до доступа к переменной.
- Доступ к статическому полю
-
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;
}
Пример 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");
Перечисления
J2ObjC генерирует два типа для каждого перечисления Java. Создается тип класса Objective-C, который обеспечивает полную функциональность перечисления Java. Кроме того, перечисление C генерируется с использованием макроса NS_ENUM платформы Foundation. Тип класса Objective-C используется всеми созданными API. Перечисление C полезно в качестве константных значений для оператора переключения или в качестве типа хранения.
Сгенерированные типы перечислений называются следующим образом:
- Класс Objective-C именуется по тому же правилу, что и обычный класс Java. (см. Типы )
- Перечисление C названо как обычный класс Java с добавленным суффиксом «_Enum».
Доступ к константам перечисления осуществляется как к статическим полям.
Пример Java
package com.google;
enum Color {
RED, GREEN, BLUE
}
Пример заголовка 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);