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

 更新时间:2015年01月09日 13:55:02   投稿:junjie  
这篇文章主要介绍了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 的柯里化版本

相关文章

  • Swift自动调整视图布局AutoLayout和AutoresizingMask功能详解

    Swift自动调整视图布局AutoLayout和AutoresizingMask功能详解

    这篇文章主要为大家介绍了Swift自动调整视图布局AutoLayout和AutoresizingMask功能及使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • swift4更新中所遇到的一些问题总结

    swift4更新中所遇到的一些问题总结

    这篇文章主要给大家介绍了关于在swift4更新中所遇到的一些问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12
  • 程序迁移到swift 3.0的一些实用技巧

    程序迁移到swift 3.0的一些实用技巧

    Swift项目为适配iOS10,无奈只能更新Xcode 8 ,可是发现一入3.0深似海,从此幸福是路人。于是边摸索边修改,终于完成了代码迁移。节后在完成手头工作后,整理思路把Swift3.0迁移的一些实用技巧分享大家,需要的朋友可以参考下。
    2017-03-03
  • Swift编程中用以管理内存的自动引用计数详解

    Swift编程中用以管理内存的自动引用计数详解

    这篇文章主要介绍了Swift编程中用以管理内存的自动引用计数详解,是Swift入门学习中的基础知识,需要的朋友可以参考下
    2015-11-11
  • 在 Swift 中测试 UIAlertController的方法

    在 Swift 中测试 UIAlertController的方法

    这篇文章主要介绍了在 Swift 中测试 UIAlertController的方法的,需要的朋友可以参考下
    2015-10-10
  • Swift中循环语句中的转移语句 break 和 continue

    Swift中循环语句中的转移语句 break 和 continue

    这篇文章主要介绍了Swift中循环语句中的转移语句 break 和 continue,本文通过实例代码给大家介绍的非常详细,需要的的朋友参考下
    2016-12-12
  • 在一个项目中同时使用Swift和Objective-C代码混合编程的方法

    在一个项目中同时使用Swift和Objective-C代码混合编程的方法

    这篇文章主要介绍了在一个项目中同时使用Swift和Objective-C代码的方法,在一个工程中同时使用Swift和Objective-C混合语言编程的方法,需要的朋友可以参考下
    2014-07-07
  • 判断 ScrollView List 是否正在滚动详解

    判断 ScrollView List 是否正在滚动详解

    这篇文章主要为大家介绍了判断 ScrollView、List 是否正在滚动示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Swift 列举内存管理与异常处理具体代码

    Swift 列举内存管理与异常处理具体代码

    内存管理和异常处理在任何编程语言中都是核心概念。尽管有很多教程解释了Swift自动引用计数的基本原理,但我发现没有一个可以从编译器的角度对其进行解释。在本文中,我们将通过详细代码列举学习Swift内存管理与异常处理
    2021-11-11
  • Swift学习笔记之元组(tuples)

    Swift学习笔记之元组(tuples)

    这篇文章主要给大家介绍了Swift中元组(tuples)的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-05-05

最新评论