Swift编程语言中的方法引用
由于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编程语言中的方法引用的更多相关文章
- Swift编程语言中如何实现自定义类型的for-in循环(基于Swift 2.2)
我们在Swift编程语言中常常会用到for-in循环(在编程语言术语中又被称为for-each).此外,从Swift 2.2版本起,for循环将只支持for-in形式,而不支持for i = 0; i ...
- Java8中的[方法引用]“双冒号”——走进Java Lambda(四)
前面的章节我们提及到过双冒号运算符,双冒号运算就是Java中的[方法引用],[方法引用]的格式是 类名::方法名 注意是方法名哦,后面没有括号“()”哒.为啥不要括号,因为这样的是式子并不代表一定会调 ...
- Java 8 中的方法引用,轻松减少代码量,提升可读性!
1. 引言 Java8中最受广大开发中喜欢的变化之一是因为引入了 lambda 表达式,因为这些表达式允许我们放弃匿名类,从而大大减少了样板代码,并提高了可读性. 方法引用是lambda表达式的一种特 ...
- java中的方法引用(method reference)官方文档总结
2017/7/5 转载写明出处:http://www.cnblogs.com/daren-lin/p/java-method-reference.html 今天要说的是java中的一项新特性,方法引用 ...
- java中的方法引用
引用静态方法:类名称::static 方法名称: 引用某个对象的方法:对象::普通方法: 引用特定类方法:特定类::方法 引用构造方法:类名称::new 范例:引用静态方法 package com.j ...
- Java 8 中的方法引用
一.原理概要 lambda 表示式,可以作为某些匿名内部类的替代.主要目的是调用该内部类中的方法,而该方法的实现(重写)由 lambda表示式决定. 通常,我们可能不关心匿名内部类中的具体方法(被重写 ...
- swift -- 类中的方法
一. 引用类型 类 在类中定义方法 class Person { //属性 var name : String = "" //方法 //实例方法 : 在类里面创建一个方法 fun ...
- swift闭包中解决循环引用的问题
swift中可以通过三种方法解决循环引用的问题 利用类似oc方法解决循环引用weak var weakSelf = self weak var weakSelf = self loadData = { ...
- Swift - AppDelegate.swift类中默认方法的介绍
项目创建后,AppDelegate类中默认带有如下几个方法,具体功能如下: 1,应用程序第一次运行时执行 这个方法只有在App第一次运行的时候被执行过一次,每次App从后台激活时都不会再执行该方法. ...
随机推荐
- 开始学CI
未来一段时间的学习计划 1.codeIgniter 2.angular JS 深入 3.react 4.python 边工作边学习,保持进步
- nodejs:csv模块解析
Nodejs最大的特点就是基于事件驱动和异步并发操作.大多数人知道nodejs是用于网络后台服务的新平台,可以很方便的提供后台服务:除了用于网络开发外,其实nodejs对于线下文件并发处理也是很方便的 ...
- 深入浅出话VC++(1)——Windows程序内部运行机制
一.引言 要想熟练掌握Windows应用程序的开发,首先需要理解Windows平台下程序运行的内部机制,然而在.NET平台下,创建一个Windows桌面程序,只需要简单地选择Windows窗体应用程序 ...
- rename() 是原子的么
对一个文件做修改, 通常认为 直接 open-seek-write-write-close 不是原子的. 1. write 本身 不一定是原子的: https://blogs.msdn.microso ...
- JQuery学习(层级)ancestor & descendant
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...
- 利用dbms_metadata.get_ddl查看DDL语句
http://www.cnblogs.com/aocle/archive/2011/10/13/2209790.html 当我们想要查看某个表或者是表空间的DDL的时候,可以利用dbms_metada ...
- 【NetDIY智能主控】开发计划
经过一个轮回,硬件开发.硬件创业又被推到了历史的前台. 面向低端.初级的硬件爱好者,以Arduino和81单片开发板为核心的开源硬件越来越深入人心,参与的人群越来越多,相关硬件和周边模块也越来越便宜. ...
- 鸟瞰Nodejs
一,基础. 1,Node的包管理器:npm; 安装node环境时会自动安装. 本地模式获取一个包:npm install [package_name] 此时包被安装到当前木的node_modules子 ...
- Dynamic CRM 2013学习笔记(三十三)自定义审批流4 - 规则节点 -有分支的流程处理
上次介绍过节点的基本配置<Dynamic CRM 2013学习笔记(三十二)自定义审批流3 - 节点及实体配置>,这次介绍下规则节点,因为有时流程里会有一些分支.合并,这时就要用到规则节点 ...
- hmailserver
开始使用: www.hmailserver.org 问题 让hmailserver的用户使用各自的中继来发送邮件: http://dagai.net/archives/968