Имя метода протокола Objective-C с использованием "To" в Swift 4 - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть .framework, который я создаю в Objective-C, и я использую его в проекте iPhone, построенном с использованием Swift 4. .Framework использует делегат для вызова методов по мере необходимости.

Я заметил, что в зависимости от того, использую ли я слово «To» в сигнатуре моего метода протокола, я получаю совсем другую реализацию в Swift.Например, если я определяю свои методы протокола как:

- (void)myApiExited:(Api*)api;
- (void)myApiReadyToPresentViewController:(Api*)api;

Тогда в моем проекте Swift я получаю:

func myApiExited(_ api:XPINApi!) {}

func myApiReady(toPresentViewController api: Api!) {}

Если, однако, я изменяю сигнатуру метода, чтобы не включать слово «Кому»'тогда имя метода в реализации становится таким, как я ожидал:

- (void)myApiReadyPresentViewController:(Api*)api;

Результат:

func myApiReadyPresentViewController(_ api: Api!) {}

Мне очень странно, что слово "Кому"вызвать это.Я ожидаю, что имя метода в моей реализации будет таким же, как в протоколе.Я делаю что-то не так или это какая-то ошибка.

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Вы никогда в своей жизни до сих пор не задумывались, почему, например, метод NSString

characterAtIndex:

встречается в Swift как

character(at:)

?

Это называется переименование и существует с Swift 3. Вы никогда не замечали этого до сих пор?

Это способ компенсации различий в соглашениях об именах методов Objective-C / Cocoa, с одной стороны, и соглашений Swift с другой, включая не только многословность Cocoa, но и тот факт, что в Objective-C все является именем параметра, тогда как в Swift есть чистое имя функции до круглой скобки и имя первого параметра после круглой скобки, что означает, что скобка Swift должна каким-то образомбыть вставленным разумным, но автоматическим способом.

Я даю вам общее представление о правилах здесь:

http://www.apeth.com/swiftBook/apa.html#_objective_c_methods

Renamifier работаетпредполагая определенное простое именованиесоглашения, которые являются традиционными в Какао.Они в основном работают разумно, но все это очень искусственно, поэтому иногда они не дают правильных результатов.В этом случае он предполагает (ошибочно), что ваше «Кому» является предлогом, и разделяется перед ним.

Но если бы ваш метод был назван, скажем, applyGlueToApi:, он бы получился как applyGlue(to:) и ты был бы очень рад этому.

0 голосов
/ 06 декабря 2018

Это сделано специально, так как импортер Objective-C использует соглашения в именах Objective-C для предоставления более адаптированных имен Swift.Я не могу найти исчерпывающий набор правил, но если вы хотите указать имя Swift, вы можете использовать NS_SWIFT_NAME.Вверху моей головы вы написали бы:

- (void)myApiReadyToPresentViewController:(Api*)api
        NS_SWIFT_NAME(myApiReadyToPresentViewController(_:));
...