我正在尝试创建一个协议,其中一种方法将返回选择器字典。但是我遇到了一个问题...
这是协议代码:
@objc public protocol MazeProtocol: AnyObject {
@objc static func configurations() -> [String:Selector]
}
,这是我得到的编译器错误:
MazeTableViewController.swift:12:24: Method cannot be marked @objc because its result type cannot be represented in Objective-C
如果我删除方法前面的@objc
,则会收到类似的错误消息。
答案 0 :(得分:3)
[String: Selector]
是Dictionary<String, Selector>
,这是一个结构,并且结构无法在Objective-C中表示,因此您需要一个NSDictionary
@objc public protocol MazeProtocol: AnyObject {
@objc static func configurations() -> NSDictionary
}
答案 1 :(得分:0)
由于无法在目标C Selector
中直接使用Dictionary
,因此可以将Swift字典的键和值类型都更改为String,如下所示。
@objc public protocol MazeProtocol: AnyObject {
@objc static func configurations() -> [String:String]
}
因此,当您想从Selector
字典中获取configurations
时,请按照以下方式进行获取。
let selectorString = configurations()["KeyToSelector"]
let selector = NSSelectorFromString(selectorString)
答案 2 :(得分:0)
正如RX9所建议的那样,在功能或协议级别上,没有理由(至少您已经解释了)将其标记为@objc
。很好:
public protocol MazeProtocol: AnyObject {
static func configurations() -> [String:Selector]
}
@objc
的重点是允许ObjC对象与该协议进行交互。如果您有需要与此协议交互的Objective-C,我强烈建议在ObjC端而不是Swift端定义此协议。 (但是,如果您遇到这种情况,请发表评论,我们将逐步介绍如何获得所需的内容;如olejnjak所述,您不能将Selector直接放在ObjC可以理解的词典中。