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从后台激活时都不会再执行该方法. ...
随机推荐
- 解决VMware下安装Ubuntu15不支持1920X1080分辨率的问题
解决步骤如下: flashmx@ubuntu:~$ cvt # 192.07M9) hsync: 67.16 kHz; pclk: 173.00 MHz Modeline -hsync +vsync ...
- fgets和fputs函数
1 函数输入 下面两个函数提供每次输入一行的功能. #include <stdio.h> char *fgets( char *restrict buf, int n, FILE *res ...
- pictures of you
http://pan.baidu.com/s/1dEAiwnB 给某人的. I've been looking so long at these pictures of you 我已对着你的照片凝视太 ...
- KEIL MDK输出map文件分析
一.文件分析流程 1.第一部分:Section Cross References 主要是各个源文件生成的模块之间相互引用的关系. stm32f10x.o(STACK) refers (Special) ...
- Address already in use: bind
Eclipse中报了这个错误,下拉小窗口,可以看到正在运行的项目,选中项目,都关闭就Ok了 还有一种方法就是关闭javaw.exe进程
- ubuntn下 nginx+phpstorm 中配置xdebug调试
xdebug安装和配置说明,主要用于个人学习记录. 一.echo phpinfo(); 搜素xdebug,若未搜素到,则标识未安装或安装失败. 二.拷贝步骤1中输出的所有结果.访问http://xde ...
- 【译】UNIVERSAL IMAGE LOADER.PART 2---ImageLoaderConfiguration详解
ImageLoader类中包含了所有操作.他是一个单例,为了获取它的一个单一实例,你需要调用getInstance()方法.在使用ImageLoader来显示图片之前,你需要初始化它的配置-Image ...
- Net中JSON序列化和反序列化处理(日期时间特殊处理)
0 缘由 笔者最近在web api端使用Json.Net进行序列化处理,而在调用端使用DataContractSerializer进行反序列化,遇到日期时间处理反序列化不成功[备注:笔者使用Net ...
- 免费好用的web应用托管平台
1.前言 曾经很久以前,想找一个免费的空间部署一个属于自己的技术博客真是太难了,使用过SAE,但是很快就面临收费了,后面也就不了了之了.目前自己又找到一个免费的PAAS平台,可以部署各种语言的web应 ...
- jQuery 消息提示/通知插件
常见消息提醒,类似于Chrome notification,易于使用,用户体验赞. // Simple $.sticky('hi, every body rock!'); // Advantage $ ...