Swift协议返回选择器字典

时间:2018-11-23 14:16:40

标签: swift swift-protocols

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

这是协议代码:

@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,则会收到类似的错误消息。

3 个答案:

答案 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可以理解的词典中。