Преобразование в Swift 3 переименовано в мой собственный метод Objective-C

У меня есть быстрые классы, смешанные с моим кодом Objective-C. С Swift 2.3 все было нормально и работало как положено.

Я недавно перешел на Swift 3, и он обновляет несколько вызовов API из-за всех переименований, которые произошли для Swift 3. Это нормально; Я понимаю.

Но что не хорошо, так это то, что Swift 3, похоже, переименовал метод в одном из моих классов Objective-C. У меня есть класс Objective-C, и я назвал метод, который я хотел: readDeliveryInfoItems, Но теперь, после преобразования в Swift 3, я не могу позвонить .readDeliveryInfoItems() больше в моем классе Swift. Это говорит мне, что он был переименован в .readItems(),

Это бессмысленно. И класс Objective-C по-прежнему вызывает метод readDeliveryInfoItemsтак что здесь что-то происходит под одеялом.

Я попытался переименовать Objective-C readDeliveryInfoItems метод для readDeliveryInfo(Свифт терпит неудачу, потому что говорит, что readInfo() метод не существует, что хорошо), а затем переименовать метод обратно в readDeliveryInfoItems, Тем не менее, когда я строю после этого, Swift возвращается к мысли, что метод называется readInfo(), Я надеялся, что это заставит Xcode обновить мост Swift и переименовать метод обратно в правильное имя readDeliveryInfoItems(), но это не так.

Как я могу это исправить?

ОБНОВЛЕНИЕ ДОБАВИТЬ БОЛЬШЕ ИНФОРМАЦИИ

Интерфейс моего класса Objective-C имеет следующее объявление функции:

- (nullable NSArray<XMPPDeliveryInfoItem *> *)readDeliveryInfoItems;

Но в Сгенерированном интерфейсе (см. Комментарий MartinR ниже) для этого класса объявление функции выглядит так:

open func readItems() -> [XMPPDeliveryInfoItem]?

В этом классе есть другие функции, которые похожи на readDeliveryInfoItems функция, такая как эта:

- (nullable NSArray<XMPPDeliveryInfoItem *> *)sentDeliveryInfoItems;

И они выглядят правильно в сгенерированном интерфейсе:

open func sentDeliveryInfoItems() -> [XMPPDeliveryInfoItem]?

Поэтому я не могу понять, почему у меня такая проблема только с одной функцией.

2 ответа

Решение

Процесс перевода подробно описан в

Соответствующая часть вашего вопроса (выделено мной):

Удалите совпадение для включающего типа из базового имени метода, если совпадение начинается после глагола. Например,

extension UIViewController {
  func dismissViewControllerAnimated(flag: Bool, completion: (() -> Void)? = nil)
}

будет выглядеть так:

extension UIViewController {
  func dismissAnimated(flag: Bool, completion: (() -> Void)? = nil)
}

Этот алгоритм сокращения, насколько я вижу, реализован в StringExtras.cpp (и использует много эвристик), а PartsOfSpeech.def содержит список слов, которые считаются глаголом, например

VERB(dismiss)
VERB(read)
VERB(send)

но не VERB(sent), Это объясняет, почему - слегка упрощая ваш пример -

@interface DeliveryInfo : NSObject
-(void)readDeliveryInfoItems;
-(void)sentDeliveryInfoItems;
@end

становится

open class DeliveryInfo : NSObject {
    open func readItems()
    open func sentDeliveryInfoItems()
}

Имя типа сокращается после глагола "прочитано", но не после не глагола "отправлено". (Вы можете проверить это, изменив имя второго метода на sendDeliveryInfoItems который затем отображается на sendItems().)

Вы можете переопределить отображение с помощью NS_SWIFT_NAME:

-(void)readDeliveryInfoItems NS_SWIFT_NAME(readDeliveryInfoItems());

Грубо говоря (и я упрощенно говорю), если суффикс имени метода является объектом глагола, соответствующим типу возвращаемого значения, суффикс удаляется.

Более простым примером будет метод с именем readString который возвращает строку NSString.

Ваш метод подпадает под эти параметры (я сказал вам, что я слишком упрощен, но вы можете примерно увидеть, как это правда), поэтому вы получаете лечение.

Лично я считаю это ошибкой, особенно потому, что в некоторых случаях изменение может привести к конфликту имен и сделать невозможным вызов метода (особенно, если API-интерфейс Objective-C не принадлежит вам, и вы не можете его изменить). Для примера, посмотрите этот вопрос: Swift 3 (опустить ненужные слова), в результате чего две функции имеют одинаковое имя

Другие вопросы по тегам