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 理解的字典中。
我正在尝试创建一个协议,其中一种方法将 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 理解的字典中。