本篇分为两部分:

一、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开发第十篇——可变参数函数&初始化方法顺序的更多相关文章

  1. ios开发-Object-C可变参数函数

    简介 一个可变参数函数是指一个函数拥有不定的参数,即为一个函数可接收多个参数.有时我们会遇到一些算术问题需要用到,比如是计算传入参数的总和,字符串的连接或是其它操作过程,我们在 OC 里也经常使用,最 ...

  2. C语言可变参数函数的编写

    1. 引言 C语言我们接触的第一个库函数是 printf(“hello,world!”);其参数个数为1个. 然后,我们会接触到诸如: printf(“a=%d,b=%s,c=%c”,a,b,c);此 ...

  3. C语言学习020:可变参数函数

    顾名思义,可变参数函数就是参数数量可变的函数,即函数的参数数量是不确定的,比如方法getnumbertotal()我们即可以传递一个参数,也可以传递5个.6个参数 #include <stdio ...

  4. C语言中可变参数函数实现原理

    C函数调用的栈结构 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈.例如,对于函数: void fu ...

  5. C可变参数函数 实现

    转自:http://blog.csdn.net/weiwangchao_/article/details/4857567 C函数要在程序中用到以下这些宏: void va_start( va_list ...

  6. C语言可变参数函数实现原理

    一.可变参数函数实现原理 C函数调用的栈结构: 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈. 本 ...

  7. c可变参数函数

    C函数要在程序中用到以下这些宏: <pre lang="c" escaped="true">void va_start( va_list arg_p ...

  8. 【转】C/C++中可变参数函数的实现

    转自:http://www.cnblogs.com/cylee025/archive/2011/05/23/2054792.html 在C语言的stdarg.h头文件中提供了三个函数va_start, ...

  9. PHP中的可变参数函数和可选参数函数

    1)可选参数函数.例如: <?phpfunction add($var1,$var2,$var3=0,$var4=0){ return$var1+$var2+$var3+$var4;}echo ...

随机推荐

  1. 用redux完成事务清单

    今天再来一个例子,我们从组件开始. App.js import React, { PropTypes } from 'react' import { bindActionCreators } from ...

  2. 【原创】kafka controller源代码分析(一)

    Kafka集群中的一个broker会被作为controller负责管理分区和副本的状态以及执行类似于重分配分区之类的管理任务.如果当前的controller失败了,会从剩下的broker中选出新的co ...

  3. WCF快速上手

    需求:在同一台机子上,有一个B/S程序,和一个C/S程序(不要问为什么,事实就是这样),B/S程序需要主动和C/S程序通信(C/S程序主动与B/S程序通信的情况这里暂不讨论). 下面以最快的速度写一个 ...

  4. C#微信公众平台开发—高级群发接口

    涉及access_token的获取请参考<C#微信公众平台开发—access_token的获取存储与更新> 一.为了实现高级群发功能,需要解决的问题 1.通过微信接口上传图文消息素材时,J ...

  5. 算法實例-C#-歸併排序-MergeSort

    # 算法实例 # 排序算法Sort 歸併排序MergeSort 算法說明 歸併的思路是任意兩個元素可以比較大小,那麼任意兩個有序的元素集合也可以通過比較大小的方式歸併成一個有序的元素集合 任何的無序元 ...

  6. C#生成随机验证码

    使用YZMHelper帮助类即可 using System; using System.Web; using System.Drawing; using System.Security.Cryptog ...

  7. 算法实质【Matrix67】

    动态规划 :你追一个MM的时候,需要对该MM身边的各闺中密友都好,这样你追MM这个问题 就分解为对其MM朋友的问题,只有把这些问题都解决了,最终你才能追到MM. 因此,该问题适用于聪明的MM,懂得“看 ...

  8. 【背景建模】SACON

    SACON(SAmple CONsensus)算法是基于样本一致性的运动目标检测算法.该算法通过对每个像素进行样本一致性判断来判定像素是否为背景. 算法框架图 由上图可知,该算法主要分为四个主要部分, ...

  9. javascript模板库jsrender for循环嵌套示例

    最近在参与整合前端的框架,我们知道javascript最强大的模板引擎之一当属jsrender,号称下一代jquery模板引擎的标准实现. 通常在模板merge的过程中,我们会遇到两次乃至三级嵌套的情 ...

  10. [AngularJS] 使用AngularCSS动态加载CSS

    [AngularJS] 使用AngularCSS动态加载CSS 前言 使用AngularAMD动态加载Controller 使用AngularAMD动态加载Service 上列两篇文章里,介绍了如何如 ...