【问题标题】:Tell Swift compiler method as swift only只告诉 Swift 编译器方法为 swift
【发布时间】:2021-03-25 08:28:34
【问题描述】:

我有一个这样定义的 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作为类前缀,然后swift编译器开始报错:

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

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

@objc@objcMembers 明确执行此操作,那么如何反向执行?

【问题讨论】:

标签: ios swift objective-c swift-compiler


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 2020-01-27
    相关资源
    最近更新 更多