ios - 只告诉 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
明确地做到这一点,那么如何扭转呢?
解决方案
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>
推荐阅读
- c# - 我使用的 HTTP 库与 Windows 7 不兼容吗?
- javascript - Await 给出错误“不能在异步函数之外使用关键字等待”
- c# - EPPlus - InsertColumn 函数无法正确复制样式
- sql - 如何将仪表板模板连接到 SQL 或任何其他数据库?
- node.js - 无法连接到 socketio/express 服务器
- javascript - 在数组中转换自定义 Json(对象)
- java - 在 Spring 中建立 OneToMany 关系后,我无法获取映射的对象
- iphone - 意外调用应用商店分发证书
- python - 使用 Python 的分发队列
- python - 如何使用 OAUTH/JWT 与 HANA 建立 Python 连接