Swift发现协议方法

时间:2014-10-09 11:07:37

标签: reflection methods swift protocols

我正在开发一个HTML5展示应用程序,我需要发现我的Swift协议中的所有方法。所有协议都扩展了基础协议。

该应用程序是用于测试此方法的HTML5展示。该应用程序调用该方法并给出响应。

我找到了一些特定协议的信息,但我需要发现我的应用程序中的所有协议,然后发现有关此方法的所有信息(名称,参数名称参数类型和返回值)。

@objc protocol Protocol {    
    func method1()
    func method2() -> Bool
    func method3(param1:Int) -> Bool
    func method4(param1:Int, param2:Int, param3:Int) -> Bool
}

var numMethods:UInt32 = 0
var methods:UnsafeMutablePointer<objc_method_description> = protocol_copyMethodDescriptionList(Protocol.self, true, true, &numMethods)

for var iuint:CUnsignedInt = 0; iuint < numMethods; iuint++ {

    var i:Int = Int(iuint)
    var method:objc_method_description = methods[i]    
    println("Method #\(i): \(method.name)")
}

我正在使用Objective-C运行时参考

有关如何在swift中执行此操作的任何想法?

2 个答案:

答案 0 :(得分:1)

你想得到:

  1. 方法实施( method_getImplementation https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/index.html#//apple_ref/c/func/method_getImplementation
  2. 和方法选择器( method_getName https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/index.html#//apple_ref/c/func/method_getName
  3. 然后在objective-c(当然使用桥接文件)中,将方法实现(即IMP)转换为函数指针。然后使用

    调用objective-c中的函数指针
    1. 选择
    2. 以及您可能拥有的任何参数

      id (*func)(id, SEL, id) = (void *)imp;
      return func(target, selector, param);`
      
    3. 看看他在博客文章中如何调用init方法,这也应该有所帮助。 http://ijoshsmith.com/2014/06/05/instantiating-classes-by-name-in-swift/

答案 1 :(得分:0)