【发布时间】:2018-11-27 15:00:45
【问题描述】:
我正在尝试实现以下目标,但遇到了问题:-)
- 创建UIViewController和UIView子类可以采用的协议
其中包含一个要在此类上调用的静态方法(调用它
configuration - 然后我想使用 ObjectiveC 运行时来查找采用该协议的类
- 在每个类上我都想调用
configuration方法 - 配置方法是返回一个字典(key:描述字符串,value:类上要调用的选择器)
到目前为止,我能够创建协议,找到实现协议的类,但我遇到了编译问题。
这是协议
@objc public protocol MazeProtocol: NSObjectProtocol{
@objc static func configurations() -> NSDictionary
}
这是在我的一个班级上采用该协议的扩展:
extension MapCoordinatorViewController: MazeProtocol {
static func configurations() -> NSDictionary {
let returnValue = NSMutableDictionary()
returnValue.setObject(#selector(test), forKey: "test" as NSString)
return returnValue
}
@objc static func test() {
print("test")
}}
这是我用来尝试调用从配置方法返回的选择器的代码:
let selectorKey = controllerClass.configurations().allKeys[indexPath.row]
let selector = controllerClass.configurations().object(forKey: selectorKey)
controllerClass.performSelector(selector) <================ error here
ControllerClass 被声明为let controllerClass: MazeProtocol.Type
我收到以下编译警告:
Instance member 'performSelector' cannot be used on type 'MazeProtocol'
我错过了什么?
【问题讨论】:
-
controllerClass.performSelector是主要问题,MazeProtocol的类型没有方法performSelector -
这是使用 Swift 语法的 Objective-C 代码。为什么不使用 Swift 特性编写这段代码呢?使用闭包代替选择器。使用 Swift 数据类型而不是 Objective-C 数据类型。
标签: swift swift-protocols objective-c-runtime