Swift 协议到 return 选择器字典

Swift protocol to return a dictionary of selector

我正在尝试创建一个协议,其中一种方法将 return 选择器字典。但是我 运行 遇到了问题...

这里是协议代码:

@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,我会得到类似的错误。

好吧 [String: Selector]Dictionary<String, Selector>,它是一个结构,而结构不能在 Objective-C 中表示,所以您需要一个 NSDictionary

@objc public protocol MazeProtocol: AnyObject {
    @objc static func configurations() -> NSDictionary
}

由于您不能直接在Objective C Dictionary 中使用Selector,您可以将Swift 字典的键和值类型都更改为String,如下所示。

@objc public protocol MazeProtocol: AnyObject {
    @objc static func configurations() -> [String:String]
}

因此,当您想从 configurations 字典中获取 Selector 时,请按如下方式获取。

let selectorString = configurations()["KeyToSelector"]
let selector = NSSelectorFromString(selectorString)

正如 RX9 所暗示的,没有理由(至少您已经解释过)在函数或协议级别将其标记为 @objc。以下是可以的:

public protocol MazeProtocol: AnyObject {
    static func configurations() -> [String:Selector]
}

@objc 的要点是允许 ObjC 对象与此协议进行交互。如果您有 Objective-C 需要与此协议交互,我强烈建议在 ObjC 端而不是 Swift 端定义此协议。 (但如果你有这种情况,请发表评论,我们可以逐步了解如何获得你需要的东西;正如 olejnjak 所指出的,你不能将 Selector 直接放在 ObjC 理解的字典中。