由于Apple官方的《The Swift Programming Guide》对Swift编程语言中的方法引用介绍得不多,所以这里将更深入、详细地介绍Swift中的方法引用。

Swift与Objective-C不同,由于Objective-C的方法都属于“消息”,因此直接用selector的消息签名即可表示一条确定的消息作为方法引用。而Swift的方法更类似于C++、Java中的方法,也就是说比Objective-C更静态,因此它不具有如此般灵活性。

另外,在Swift编程语言中,方法引用与C++中的不同,而与Java的类似,是要与当前对象绑定在一起的。如果方法引用所指向的某个类的方法,该方法没有被重载,那么可直接使用 对象名 . 方法名 的方式来表示。如果方法有被重载,那么需要一个完整的描述形参的信息,这就类似于Objective-C中的消息签名,需要把形参的标签名(外部名)加上。不过,由于Swift是强类型语言,因此也可以直接指定方法引用的类型来确定指向哪个重载方法。

class ViewController: NSViewController {

    override func viewDidLoad() {
super.viewDidLoad() // 由于myMethod方法被重载,
// 因此这里对funcRef显式指定类型来指明指向不带任何参数的myMethod方法
let funcRef: () -> Void = self.myMethod
funcRef()

// 或者可以这么写:直接显式地在方法名后添加上类型

let funcRef2 = self.myMethod as () -> Void

funcRef2()

        // 这里使用方法签名myMethod(a:)来指明metohdRef指向myMethod(a a: Int)方法,
// 而methodRef的类型被推导为:(a: Int) -> Void
var methodRef = self.myMethod(a:)
methodRef(a: ) methodRef = self.myMethod(_:)
methodRef(a: ) // 这里即便有一个a:标签也无所谓,调用的仍然是myMethod(_:)方法 // 各位请注意,这里的mref的类型为:(_: Int) -> Void
// 注意,其形参不含外部标签
var mref = self.myMethod(_:)
mref() // 这里又指向了myMethod(a: Int)方法
mref = self.myMethod(a:)
mref() // 仅管这里没有标签,但调用时仍然调用的是myMethod(a: Int)方法 /** 上述是隐式地做类型推导,而下面我们可以用显式的类型指定 */ // 显式指明ref是一个带有含外部标签b的形参的方法引用
let ref: (b: Int) -> Void = self.myMethod(a:)
ref(b: )

/** 以下是对应的selector的描述 */

var sel: Selector = #selector(self.myMethod(a:))

sel = #selector(self.myMethod(_:))

// 对于不带参数的方法,被用作selector时,必须在后面显式地加上函数类型

sel = #selector(self.myMethod as () -> Void)

    }

    func myMethod() {
print("My method!")
} func myMethod(a a: Int) {
print("Method2 value = \(a)")
} func myMethod(_ a: Int) {
print("Method3 value = \(a)")
} override var representedObject: AnyObject? {
didSet {
// Update the view, if already loaded.
}
}
}

在上述代码中,我们不能用self.myMethod()来表示一个不带参数的方法引用,也不能用myMethod(_),因为这两种形式已经表示了方法调用,而不是方法签名。方法签名中,形参列表中必然至少要包含一个冒号。

当然,在Swift2.2中,self.myMethod在含有重载方法的情况下,不能直接表示没有任何形参的方法,这点非常遗憾~如果对funcRef不指明函数类型,那么编译器会报“存在歧义的方法名”的错误。实际上,在Swift中,一个方法引用自己可以指明本身的形参的外部标签,这属于方法引用自身的属性,而不完全依赖于它所引用的方法。不过不管怎么说,方法引用自身是否含有外部标签都不影响它具有一个形参的事实,因而必定带有一个冒号,所以希望这点能在Swift 3.x版本中有所改进!至少能保证self.myMethod就表示一个不含任何形参的方法~而对于带有相同类型、相同个数参数的,则使用指定方法签名的方式加以区别即可~

Swift编程语言中的方法引用的更多相关文章

  1. Swift编程语言中如何实现自定义类型的for-in循环(基于Swift 2.2)

    我们在Swift编程语言中常常会用到for-in循环(在编程语言术语中又被称为for-each).此外,从Swift 2.2版本起,for循环将只支持for-in形式,而不支持for i = 0; i ...

  2. Java8中的[方法引用]“双冒号”——走进Java Lambda(四)

    前面的章节我们提及到过双冒号运算符,双冒号运算就是Java中的[方法引用],[方法引用]的格式是 类名::方法名 注意是方法名哦,后面没有括号“()”哒.为啥不要括号,因为这样的是式子并不代表一定会调 ...

  3. Java 8 中的方法引用,轻松减少代码量,提升可读性!

    1. 引言 Java8中最受广大开发中喜欢的变化之一是因为引入了 lambda 表达式,因为这些表达式允许我们放弃匿名类,从而大大减少了样板代码,并提高了可读性. 方法引用是lambda表达式的一种特 ...

  4. java中的方法引用(method reference)官方文档总结

    2017/7/5 转载写明出处:http://www.cnblogs.com/daren-lin/p/java-method-reference.html 今天要说的是java中的一项新特性,方法引用 ...

  5. java中的方法引用

    引用静态方法:类名称::static 方法名称: 引用某个对象的方法:对象::普通方法: 引用特定类方法:特定类::方法 引用构造方法:类名称::new 范例:引用静态方法 package com.j ...

  6. Java 8 中的方法引用

    一.原理概要 lambda 表示式,可以作为某些匿名内部类的替代.主要目的是调用该内部类中的方法,而该方法的实现(重写)由 lambda表示式决定. 通常,我们可能不关心匿名内部类中的具体方法(被重写 ...

  7. swift -- 类中的方法

    一. 引用类型  类 在类中定义方法 class Person { //属性 var name : String = "" //方法 //实例方法 : 在类里面创建一个方法 fun ...

  8. swift闭包中解决循环引用的问题

    swift中可以通过三种方法解决循环引用的问题 利用类似oc方法解决循环引用weak var weakSelf = self weak var weakSelf = self loadData = { ...

  9. Swift - AppDelegate.swift类中默认方法的介绍

    项目创建后,AppDelegate类中默认带有如下几个方法,具体功能如下: 1,应用程序第一次运行时执行 这个方法只有在App第一次运行的时候被执行过一次,每次App从后台激活时都不会再执行该方法. ...

随机推荐

  1. javascript 对象属性的get set访问器写法

    function Person() {     var age = new Date().getFullYear() - 18;     Object.defineProperty(this, &qu ...

  2. vsftpd的主动模式与被动模式

    好不容易配置好了vsftpd服务,在CentOS本机测试没有问题,但是在我的Windows机器上使用FlashFXP连接的时候却出问题了: 我虽然知道FTP存在两种模式:PORT(主动)模式.PASV ...

  3. Masonry 轻量级布局框架的使用

    iOS 提供了自动布局的方法,但是原生的方法使用太过麻烦 ,Masonry 框架提供了类似的方法,同样可以实现自动布局 ,代码更加直观,而且容易理解. Masonry 是一个轻量级的布局框架.拥有自己 ...

  4. iOS Swipe Tableviewcell(左右滑动出现按钮)

    1.背景 看到QQ的左右滑动Tableviewcell时可以出现多个菜单,觉得很高大上,因为没这种需求, 也只是需要一个删除按钮,这个系统已经帮我们实现了,只需要实现几个代理就可以,做出左划 出现删除 ...

  5. 基于VC的声音文件操作(一)

    (一)文件格式 1.RIFF文件结构和WAVE文件格式 Windows支持两种RIFF(Resource Interchange File Format,"资源交互文件格式")格式 ...

  6. poj 3635/hdu 1676 Full Tank? 车辆加油+最短路

    http://acm.hdu.edu.cn/showproblem.php?pid=1676 给出一张图,n<=1000,m<=10000. 有一辆车想从图的一个地方到达另外一个地方,每个 ...

  7. 《理解 ES6》阅读整理:块绑定(Block Binding)

    变量声明一直是JavaScript中一个需要技巧的部分.在大多数基于C的编程语言中,变量(更正式地说是绑定)在声明的时候创建,然而在JavaScript中并不是这样.在JavaScript中,变量在何 ...

  8. JQuery学习(选择器-简单-animated)

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  9. sublime Text3 插件编写教程_第一课

    今天给大家分享一下编写一个Sublime Text3 插件的流程以及使用插件解决的一个实际问题. 一.开发插件的前提条件 开发sublime插件用到的是Python语言,因此必须懂Python语言的基 ...

  10. [转]删除SQL Server Management Studio中保存的帐户信息

    http://www.2cto.com/database/201208/149850.html   删除SQL Server Management Studio中保存的帐户信息   SQL Serve ...