Ошибка ‘Метод Objective-C ‘: ‘предоставленный методом ‘ ‘ не соответствует селектору требования при попытке переименования с помощью @objc (новое имя)

#ios #objective-c #swift

#iOS #objective-c #swift

Вопрос:

У меня есть метод

 public func presentSomeView(with viewId: String? = nil, from viewController: UIViewController, completion: ((UIViewController) -> ())? = nil)
  

Я пытаюсь, чтобы Objective-C API был

 presentSomeViewWithId: from: completion:
  

Вместо этого по умолчанию:

 presentSomeViewWith: from: completion:
  

Чтобы попытаться исправить это, я написал:

 @objc(presentSomeViewWithId:from:completion:) 
public func presentSomeView(with viewId: String? = nil, from viewController: UIViewController, completion: ((UIViewController) -> ())? = nil)
  

Xcode выдает следующую ошибку «Исправить»:

 Objective-C method 'presentSomeViewWithId:from:completion:' provided by method 'presentSomeView(with:from:completion:)' does not match the requirement's selector ('presentSomeViewWith:from:completion:')

Replace 'presentSomeViewWithId:from:completion:' with 'presentSomeViewWith:from:completion:'
  

Чего мне здесь не хватает? Я искал везде, и по всем предложениям это должно сработать.

Комментарии:

1. Что, если вместо этого вы скажете WithID (обратите внимание на заглавные буквы)?

2. Вы видите ошибку в объявлении или при попытке вызвать функцию из файла Objective-C? Я вставил объявление в файл Swift и не получил ошибку.

3. Я не могу воспроизвести это в Xcode 10.1 / Swift 4.2.

4. Сообщение об ошибке заставляет меня задуматься, является ли этот метод частью реализации протокола. Так ли это? Если это так, и если протокол является @objc , селекторы методов будут ограничены протоколом, и вы не сможете их изменить.

5. Оказывается, методы БЫЛИ частью протокола, и мне нужно было переименовать их там. Проблема решена