当前位置: 首页 > 编程笔记 >

Swift中动态调用实例方法介绍

岑鸣
2023-03-14
本文向大家介绍Swift中动态调用实例方法介绍,包括了Swift中动态调用实例方法介绍的使用技巧和注意事项,需要的朋友参考一下

在 Swift 中有一类很有意思的写法,可以让我们不直接使用实例来调用这个实例上的方法,而是通过类型取出这个类型的某个实例方法的签名,然后再通过传递实例来拿到实际需要调用的方法。比如我们有这样的定义:


class MyClass {

    func method(number: Int) -> Int {

        return number + 1

    }

}


想要调用 method 方法的话,最普通的使用方式是生成MyClass的实例,然后用.method来调用它:

let object = MyClass()

let result = object.method(1)

// result = 2


这就限定了我们只能够在编译的时候就决定object实例和对应的方法调用。其实我们还可以使用刚才说到的方法,将上面的例子改写为:

let f = MyClass.method

let object = MyClass()

let result = f(object)(1)


这种语法看起来会比较奇怪,但是实际上并不复杂。Swift中可以直接用 Type.instanceMethod的语法来生成一个可以柯里化的方法。如果我们观察 f 的类型 (Alt + 单击),可以知道它是:

f: MyClass -> (Int) -> Int


其实对于 Type.instanceMethod 这样的取值语句,实际上刚才

let f = MyClass.method


做的事情是类似于下面这样的字面量转换:

let f = { (obj: MyClass) in obj.method }


这下就不难理解为什么上面的调用方法可以成立了。

这种方法只适用于实例方法,对于属性的 getter或者setter 是不能用类似的写法的。另外,如果我们遇到有类型方法的名字冲突时:


class MyClass {

    func method(number: Int) -> Int {

        return number + 1

    }

    class func method(number: Int) -> Int {         return number     } }


如果不加改动,MyClass.method 将取到的是类型方法,如果我们想要取实例方法的话,可以显式地加上类型声明加以区别。这种方式不仅在这里有效,在其他大多数名字有歧义的情况下,都能很好地解决问题:

let f1 = MyClass.method

// class func method 的版本

let f2: Int -> Int = MyClass.method // 和 f1 相同

let f3: MyClass -> Int -> Int = MyClass.method // func method 的柯里化版本

 类似资料:
  • 本文向大家介绍java动态方法调度实例分析,包括了java动态方法调度实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java动态方法调度。分享给大家供大家参考,具体如下: 动态方法调度: 1. 访问一个引用型的变量的非静态方法,运行时与实际引用的对象的方法绑定。 2. 访问一个引用型的变量的静态方法,运行时与声明的类的方法绑定。 3. 访问一个引用型的变量的成员变量(包括静态变量

  • 问题内容: 请具有PHP经验的人提供以下帮助。在我的代码中的某个地方,我调用了一个非实例化类中的公共静态方法: 但是,我希望有许多这样的类,并根据用户的语言即时确定正确的类名称。换句话说,我有: …,我需要做类似的事情: 我知道我可以将语言作为参数传递给函数,并在一个通用类中处理它,但是由于种种原因,我希望使用其他解决方案。 有人吗?谢谢。 问题答案: 使用call_user_func函数: ht

  • 本文向大家介绍C#中事件的动态调用实现方法,包括了C#中事件的动态调用实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#动态调用事件的方法。一般来说,传统的思路是,通过Reflection.EventInfo获得事件的信息,然后使用GetRaiseMethod方法获得事件被触发后调用的方法,再使用MethodInfo.Invoke来调用以实现事件的动态调用。 但是很不幸的,Ref

  • 问题内容: 有没有一种方法可以在PHP的同一类中动态调用方法?我的语法不正确,但是我正在寻找类似的方法: 问题答案: 有多种方法可以做到这一点: 您甚至可以使用反射API http://php.net/manual/en/class.reflection.php

  • 本文向大家介绍MyBatis中动态sql的实现方法示例,包括了MyBatis中动态sql的实现方法示例的使用技巧和注意事项,需要的朋友参考一下 1. 动态sql 动态sql是mybatis中的一个核心,什么是动态sql? 动态sql即对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。 MyBatis的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的

  • 我正在使用Saxon(如果需要,我可以使用Xalan)XSLT处理器进行一些转换。我想将下面对象的实例作为参数传递给XSLT模板。 所以我创建了这个对象。 在XSLT文件中,我将参数声明为: 现在我的问题是如何在XSLT内调用该对象的任何实例方法(即.getValue())?有可能吗?我知道我可以调用不同Java类的静态方法,但这并不完全是我想要的。 此外,是否可以在XSLT中填充Java对象,即