使用反射调用方法

2024-03-22

据我了解,Swift 中的反射目前还不太可用。为了提高性能,我目前正在将 Objective-C 代码转换为 Swift(我注意到有很大的差异)。

现在我需要的是一种使用反射调用方法的方法。需要调用该方法的对象扩展NSObject使用以下代码可以解析该类;

let clazz = NSClassFromString("MyProject.DynamicClass") as NSObject.Type; 
let clazzInstance = clazz() as! NSObject;

我可以使用以下代码检索参数的数量和对该方法的引用;

let selectorMethod = Selector("myCustomMethod:");

let numberOfArguments : UInt32 = method_getNumberOfArguments(selectorMethod);
let referenceToMethod : Method = class_getInstanceMethod(clazz, selector!);

但是我如何使用/调用referenceToMethod?

额外的
我也尝试过调用performSelector,但这已被完全删除Swift 2。我还想阻止使用任何@objc属性/注释。


如果您正在寻找一种完全 Swifty 的反射方式,那么具有需要调用的方法的对象根本不需要是 NSObject,而是需要一个必需的初始化程序。看看下面的例子:

class A {
    required init() {}

    func printSomething(s: String) {
        print(s)
    }
}

// initializing object dynamically from class
let clazz = NSClassFromString("MyProject.A") as! A.Type   
let clazzInstance = clazz()

// getting and calling its methods in Swifty way    
let method = clazzInstance.printSomething 
method("something")

使用它的优点在于,您根本不需要使用强制转换,并且使用错误的参数调用方法会触发编译时错误

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用反射调用方法 的相关文章

随机推荐

  • 在 Android ICS (4.0) 中禁用主页按钮

    我正在为一家公司制作一个专有应用程序 该公司永远不会将其发布到 Ice Cream Sandwich Android 4 0 的 Android Market 或我猜现在是 Play Store 我需要禁用主页 以便用户无法恶意卸载软件或删
  • 如何在 ruby​​ 中跳过 require ?

    我可以有条件地跳过需要 Ruby 中的文件吗 begin require aws sdk rescue LoadError puts aws sdk gem not found end namespace db do desc import
  • 为什么我要在服务器上运行 Html 控件? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 为什么我要在服务器上运行 Html 控件 比如 我为什么要这样做 p This is a paragraph p 如果您想在隐藏代码中引用它 像
  • 4 级继承链中的 C++ 虚拟析构函数。

    我正在用虚拟析构函数做一个小实验来回顾 想知道是否有人对以下内容有一个简单的解释 使用 vs 2010 I 定义类层次结构A B C D D继承C C继承B B继承A A为Base 进行了 2 个实验 第一个实验 A 有一个虚拟析构函数 B
  • Laravel 在更改新密码时检查旧密码

    我想检查用户是否传递 new password 输入作为当前密码 我想使用消息重定向 Your current password can t be with new password 我怎样才能检查这个 我想要系统更改用户密码 但我想要拒绝
  • 对于大请求,Nginx 上游在从上游读取响应标头时过早关闭连接

    我正在使用 nginx 和节点服务器来服务更新请求 当我请求更新大数据时 我遇到网关超时 我从 nginx 错误日志中看到了这个错误 2016 04 07 00 46 04 错误 28599 0 1 上游过早关闭 从上游 客户端读取响应头时
  • 在运行时动态添加实体类

    我需要在运行时将实体类添加到持久性单元 而不是在 persistence xml 中指定所有实体类 有人可以帮助我吗 我知道 Hibernate 有自己的机制来执行相同的操作 AnnotationConfiguration addAnnot
  • TextBox 上的 GWT 输入事件

    给出以下代码 TextBox tb new TextBox tb addValueChangeHandler new ValueChangeHandler
  • Application_AuthenticationRequest 中设置的 Thread.CurrentPrincipal 稍后不会在应用程序中设置

    在 Application AuthenticationRequest 的 global asax 文件中 我将 Thread CurrentPrincipal 设置为自定义主体 我还将 HttpContext Current User 设
  • “比特率”属性是否固定在索引 28 中?

    我正在尝试读取音频文件的 比特率 属性 我知道如何获得价值 但我认为我这样做的方式不是最有效的 Shell shell new Shell32 Shell Folder objFolder shell NameSpace path for
  • PHP 中如何对值进行四舍五入?

    我有一个这样的值 value 2 3333333333 我想将这个值四舍五入为这样 value 2 35 我已经尝试过 round ceil 等 但结果不是我所期望的 请任何人帮忙 Thanks 从字面上看你的问题 这样就可以了 value
  • 如何覆盖 Struts 2 消息?

    这是我的 struts xml 的一部分
  • Web 客户端使用下载文件从服务器抓取文件 - 处理异常

    我有一个 Web 服务 在其中操作 POST 和 GET 方法 以促进客户端 服务器样式体系结构中某些文件的上传 下载功能 基本上 用户可以单击按钮下载特定文件 在应用程序中进行一些更改 然后单击上传按钮将其发回 我遇到的问题是下载 假设用
  • 在.NET Framework 3.0中将本地时间转换为UTC

    我开发一个应用程序 在 C 中 我应该将本地时间转换为 UTC 本地时间位于我的应用程序中使用的时区 进入 我必须在 NET Framework 3 0中使用 所以不能使用TimeZoneInfo对象 有人有 idia 我该怎么做 应该在
  • 使用 json-c 解析深度嵌套的 JSON 键

    我正在使用json c 库 https json c github io json c 在查看文档后 我找不到一种方法来获取深层嵌套的键 值而不使用一堆循环 这是我尝试过的 json object object foreach json d
  • KTor 站点无法访问

    我想使用 ktor 制作一个简单的 http 服务器 但是 当我输入该站点 127 0 0 1 8080 或 0 0 0 0 8080 时 它就不存在 它不打印也不响应 但是 如果我使用 NanoHttpd 而不是 ktor 则一切正常 我
  • 如何通过 git 共享 odt/doc 文档

    我的想法是我想通过 git 共享和跟踪文档 我考虑过使用可以用任何文本编辑器 不是二进制 编辑的文本文档 功能上看 起来像 docx odt 的 markdown 文档 哪里可以找到这样的东西 有更好的解决方案吗 LaTeX 非常适合将其与
  • 将类型包装在结构中会导致额外的填充吗? [复制]

    这个问题在这里已经有答案了 可能的重复 具有单个元素的结构体的大小 https stackoverflow com questions 3585033 size of struct with a single element 给定任何类型A
  • 在 Linux for Windows 上编译 C++ 代码时出错

    我正在尝试使用以下命令在 Linux 主机上编译适用于 Windows 的 C 应用程序 i686 w64 mingw32 g o app exe app cpp 但代码中导入了特定的 Windows 库 import mscorlib t
  • 使用反射调用方法

    据我了解 Swift 中的反射目前还不太可用 为了提高性能 我目前正在将 Objective C 代码转换为 Swift 我注意到有很大的差异 现在我需要的是一种使用反射调用方法的方法 需要调用该方法的对象扩展NSObject使用以下代码可