Каркас Objective-C, используемый в Swift - неоднозначное использование метода error - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть среда Objective-C, в которой я осудил метод и заменил его другим:

+ (void)methodName:(BOOL)value; + (void)MethodName:(BOOL)value __attribute__((deprecated("from version 2.0 - use 'methodName'")));

, который прекрасно работает в проекте Objective-C с использованиемFramework, но когда я пытаюсь вызвать этот метод в проекте Swift, я получаю следующую ошибку:

AppDelegate.swift: 21: 3: неоднозначное использование 'methodName' enter image description here

(двойной щелчок мышью на! Найденная строка-кандидат никуда не денется)

Проблема заключается в том, что автоматическое преобразование в Swift имен методов конфликтует только с первой буквойизменен на нижний регистр.

Можно ли как-то обернуть устаревший метод в прагму типа #if OBJECTIVE_C, чтобы модуль Swift был открыт только для одной (более новой) версии метода?

Или другой способ обойти автоматический перевод?

1 Ответ

0 голосов
/ 28 сентября 2018

Оба метода Objective C импортируются в Swift как

open class func methodName(_ value: Bool)

, и это вызывает неоднозначность.

Если устаревший метод вообще не должен быть доступен в Swift, вы можете аннотироватьэто с NS_SWIFT_UNAVAILABLE:

+ (void)methodName:(BOOL)value;
+ (void)MethodName:(BOOL)value __attribute__((deprecated("from version 2.0 - use 'methodName'")))
    NS_SWIFT_UNAVAILABLE("deprecated method not available in Swift");

Другой вариант - аннотировать устаревший метод с помощью NS_SWIFT_NAME:

+ (void)methodName:(BOOL)value;
+ (void)MethodName:(BOOL)value __attribute__((deprecated("from version 2.0 - use 'methodName'")))
    NS_SWIFT_NAME(oldMethodName(_:));

, чтобы он импортировался в Swift как

open class func methodName(_ value: Bool)

@available(*, deprecated, message: "from version 2.0 - use 'methodName'")
open class func oldMethodName(_ value: Bool)

См.

для получения дополнительной информации.

...