Swift开发第十篇——可变参数函数&初始化方法顺序
本篇分为两部分:
一、Swift中的可变参数函数
二、初始化方法的顺序
一、Swift中的可变参数函数
可变参数函数指的是可以接受任意多个参数的函数,在 OC 中,拼接字符串的函数就属于可变参数函数
NSString *name = @"Tom";
NSDate *date = [NSDate date];
NSString *string = [NSString stringWithFormat:
@"Hello %@. Date: %@", name, date];
在 swift 中定义可变参数函数:
func sum(input: Int...) -> Int {
return input.reduce(, combine: +)
}
print("result:\(sum(1,2,3,4,5))")
输出结果:

注意:可变参数只能作为方法中的最后一个参数来使用,而不能先声明一个可变参数,然后再声明其他参数。因为编译器不知道输入的参数应该从哪里截断。另外,在一个方法中,最多只能有一组可变参数。而且传入的可变参数必须是所指定的类型。
Swift 提供了使用下划线 _ 来作为参数的外部标签,来使调用时不再需要加上参数名字。我们可以利用这个特性,在声明方法时就指定第一个参数为一个字符串,然后跟一个匿名的参数列表,这样在写起来的时候就好像是所有参数都是在同一个参数列表中进行的处理。
比如:进入到 Swift 中, 就会看到 NSString 格式化的声明就是这样处理的:
extension NSString {
convenience init(format: NSString, _ args: CVarArgType...) {
self.init()
}
//...
}
调用的时候就和在 OC 时几乎一样了,非常方便:
let name = "Tom"
let date = NSDate()
let string = NSString(format: "Hello %@. Date: %@", name, date)
二、初始化方法的顺序
让我们在 Swift 开发中最不习惯的问题之一可能就包含 Swift 的初始化方法需要保证类型的所有属性都被初始化,所以初始化方法的调用顺序就很有讲究。我们在保证当前子类实例的成员初始化完成后才能调用父类的初始化方法:
class Animal {
var name: String?
init() {
name = "Animal"
}
}
let animal = Animal()
print(animal.name)
class Dog: Animal {
let age: Int
override init() {
age =
// 如果不先把子类的成员初始化完成,下面就无法调用父类的初始化方法会报错,Swift 会自动的对父类的对应 init 方法进行调用,如果不需要改变父类属性的话,可以不写
super.init() // Property 'self.age' not initialized at super.init call
name = "a dog" // 根据实际情况修改
}
}
print(Dog().name)
综上,子类的初始化顺序是:
1.设置子类自己需要初始化的参数,age = 10 (是条老狗了)
2.调用父类的相应的初始化方法, super.init() (Swift 会自动的对父类的对应 init 方法进行调用,可以不写)
3.对父类中需要改变的成员进行设定, name = "a dog" (根据实际情况修改)
Swift开发第十篇——可变参数函数&初始化方法顺序的更多相关文章
- ios开发-Object-C可变参数函数
简介 一个可变参数函数是指一个函数拥有不定的参数,即为一个函数可接收多个参数.有时我们会遇到一些算术问题需要用到,比如是计算传入参数的总和,字符串的连接或是其它操作过程,我们在 OC 里也经常使用,最 ...
- C语言可变参数函数的编写
1. 引言 C语言我们接触的第一个库函数是 printf(“hello,world!”);其参数个数为1个. 然后,我们会接触到诸如: printf(“a=%d,b=%s,c=%c”,a,b,c);此 ...
- C语言学习020:可变参数函数
顾名思义,可变参数函数就是参数数量可变的函数,即函数的参数数量是不确定的,比如方法getnumbertotal()我们即可以传递一个参数,也可以传递5个.6个参数 #include <stdio ...
- C语言中可变参数函数实现原理
C函数调用的栈结构 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈.例如,对于函数: void fu ...
- C可变参数函数 实现
转自:http://blog.csdn.net/weiwangchao_/article/details/4857567 C函数要在程序中用到以下这些宏: void va_start( va_list ...
- C语言可变参数函数实现原理
一.可变参数函数实现原理 C函数调用的栈结构: 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈. 本 ...
- c可变参数函数
C函数要在程序中用到以下这些宏: <pre lang="c" escaped="true">void va_start( va_list arg_p ...
- 【转】C/C++中可变参数函数的实现
转自:http://www.cnblogs.com/cylee025/archive/2011/05/23/2054792.html 在C语言的stdarg.h头文件中提供了三个函数va_start, ...
- PHP中的可变参数函数和可选参数函数
1)可选参数函数.例如: <?phpfunction add($var1,$var2,$var3=0,$var4=0){ return$var1+$var2+$var3+$var4;}echo ...
随机推荐
- 转自coolshell--vim的基本操作
开始前导语: 在正式转入python开发后,日常的工作中会和大量linux相关命令和工具接触,从另外一个层面,学习的东西相当的多,而VIM在整个的linux体系中所占据的角色就更不用说了,之前在处理g ...
- Visual Studio 技能GET
常用快捷键 自动生成头部注释 代码片段 NuGet Team Foundation 常用的VS快捷键 查看与设置快捷键 一般在菜单里面我们直接就可以看到一些功能的快捷键.另外,可以依次通过 菜单栏-工 ...
- MS SQL中使用UPDATE ... INNER JOIN ...
昨天的SQL编程中,有使用到一个方法,就是把一个表某一字段更新至另一个表的字段中去. 实现这个方法,Insus.NET有尝试了几个方法,下面一一分享出来,让大家参考参考. 下面的数据只是模拟了,形式与 ...
- C#导出Excel那些事
Excel导出 Excel导出的意义 因为在项目中有些报表数据客户需要导出功能,那么导出为Excel就十分有必要了,可是有些客户的机器上并没有安装Excel或者安装的版本参差不一.那么我们在这样的情况 ...
- 在Win Server 2012中安装.NET Framework 3.5的问题
在Windows Server 2012 上安装 SQL Server 2012 时,提示 启用 Windows 功能 NetFx3 时出错,错误代码:-2146498298.请尝试从 Windows ...
- XE7 Android 中使用 MessageDlg 范例
MessageDlg('Choose a button:', System.UITypes.TMsgDlgType.mtInformation, [ System.UITypes.TMsgDlgBtn ...
- 迷信AgainAndAgain
又重新在VBox中安装Debian其它镜像两次,依然在安装桌面软件包时挂掉...
- 【书籍下载链接】_1_第一轮_C语言书籍
各位朋友,如果您觉得下载的电子书,看的还可以,请购买纸质版的图书,如果您觉得 您下载的书,不值得一看请在下载后直接删除. Windows汇编:http://dl.vmall.com/c0jk1v970 ...
- Java集合源码分析(三)LinkedList
LinkedList简介 LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做栈.队列和双端队列来使用. LinkedList同样是非线程安全 ...
- PHP storm快捷键
左边文件路径看不到了,按alt+1就出来了 ctrl+j 插入活动代码提示 ctrl+alt+t 当前位置插入环绕代码 alt+insert 生成代码菜单 ctrl+q 查看代码注释 ctrl+d 复 ...