У меня есть способ просмотреть открытый заголовок Objective-C для быстрого

У меня проблемы с пониманием, почему некоторые функции-члены из импортированного (и сложного) набора интерфейса Objective-C недоступны в Swift.

У меня есть файл заголовка моста:

#import "EvernoteSDK.h"

и я не могу использовать некоторые функции-члены в моем ViewController

let userStore = EvernoteUserStore()
userStore.initWithSession(session)

initWithSession недоступен для быстрого кода, но почему?

Заголовок target-C показывает:

@interface EvernoteUserStore : ENAPI
+ (instancetype)userStore;
- (id)initWithSession:(EvernoteSession *)session;

Если бы я мог просмотреть открытый заголовок Objective-C, я мог бы понять, как работает искажение


person ChaosSpeeder    schedule 14.06.2014    source источник


Ответы (1)


В Swift вызов инициализатора сочетается с конструктором. Другими словами, Objective-C

EvernoteUserStore *userStore = [[EvernoteUserStore alloc] initWithSession:session];

становится

let userStore = EvernoteUserStore(session:session);

Инструмент распознает initWithSomething: имя Objective-C и преобразует его в

init(something something : SomeType)

В случае EvernoteUserStore соответствующий метод init выглядит так:

init(session session: EvernoteSession!)
person Sergey Kalinichenko    schedule 14.06.2014
comment
Большое спасибо. Ваш ответ решил мою проблему. Где я могу найти правила коверкания? У меня опыт работы с C# и C++, и мне кажется неудобным, когда только соглашение об именах диктует поведение инструмента. - person ChaosSpeeder; 14.06.2014
comment
@ChaosSpeeder Я сам не очень хорошо знаком со Swift, но похоже, что изменение имен применяется в двух ситуациях: initWith... инициализаторы и фабричные методы класса sometypeWith... (например, arrayWithObject: из NSArray). Эти два следуют давним соглашениям Cocoa, поэтому инструмент делает перевод для вас в соответствии с новыми соглашениями Swift. Другие методы должны оставаться нетронутыми. - person Sergey Kalinichenko; 14.06.2014
comment
В документации по совместимости Apple долго обсуждались правила искажения. - person David Berry; 14.06.2014
comment
Вам также следует посмотреть видео Integrating Swift with Objective C и Swift Interoperability in Depth с WWDC. - person Matt Gibson; 15.06.2014