【问题标题】:Objective-C framework used in Swift - ambiguous use of method errorSwift 中使用的 Objective-C 框架 - 使用方法错误的模棱两可
【发布时间】:2018-09-28 14:44:43
【问题描述】:

我有一个 Objective-C 框架,我在其中弃用了一个方法并将其替换为另一个方法:

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

在使用框架的 Objective-C 项目中效果很好,但是当我尝试在 Swift 项目中调用该方法时,我收到以下错误:

AppDelegate.swift:21:3: 'methodName' 的使用不明确

(双击!发现这条候选线没有去任何地方)

问题似乎是方法名称的自动转换为 Swift 与仅将第一个字母更改为小写的冲突。

有什么方法可以将不推荐使用的方法包装在 #if OBJECTIVE_C 类型的杂注中,以便 Swift 模块只暴露于该方法的一个(较新)版本?

或者另一种解决自动翻译的方法?

【问题讨论】:

    标签: ios objective-c swift frameworks


    【解决方案1】:

    两种 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)
    

    了解更多信息。

    【讨论】:

    • 谢谢 Martin R - 对于我的具体情况,我将使用 NS_SWIFT_UNAVAILABLE,但很高兴看到其他可用选项以及文档链接(尽管 Apple 无疑会将它们全部移入再过一两年... ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多