首页 > 解决方案 > 只告诉 Swift 编译器方法为 swift

问题描述

我有一个这样定义的快速类:

@objcMembers
public class MyURL: NSObject {

    func concat(_ components: String...) -> MyURL {
        concat(components)
    }

    /// Concat the specified components one by one.
    func concat(_ components: [String]) -> MyURL {
        components.forEach { let _ = value?.appendingPathComponent($0) }
        return self
    }

    // All the other methods which are available for objc.
}

里面有很多方法可以用于objective-c,所以我@objcMembers直接使用for类前缀,然后swift编译器开始抱怨这个:

方法 'concat' 与 Objective-C 选择器 'concat:' 与先前使用相同 Objective-C 选择器的声明冲突

它们具有完全相同的函数签名,但后者即使暴露也仅可用于 swift。现在我正在寻找一些编译标志来将后一种concat方法标记为swift 只是为了告诉编译器忽略冲突错误。

@objc@objcMembers明确地做到这一点,那么如何扭转呢?

标签: iosswiftobjective-cswift-compiler

解决方案


https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#nonobjc

“nonobjc 将此属性应用于方法、属性、下标或初始化程序声明以抑制隐式 objc 属性。nonobjc 属性告诉编译器使声明在 Objective-C 代码中不可用,即使它可以在 Objective-C 中表示。

将此属性应用于扩展与将其应用于该扩展中未显式标记为 objc 属性的每个成员具有相同的效果。

您可以使用 nonobjc 属性来解决在标有 objc 属性的类中桥接方法的循环性,并允许在标有 objc 属性的类中重载方法和初始化程序。

用 nonobjc 属性标记的方法不能覆盖用 objc 属性标记的方法。但是,标有 objc 属性的方法可以覆盖标有 nonobjc 属性的方法。类似地,标有 nonobjc 属性的方法不能满足标有 objc 属性的方法的协议要求。”</p>


推荐阅读