Swift from Scratch: An Introduction to Functions

为了让Swift完成某些工作,你需要学习函数的来龙去脉。Swift中的函数非常强大和灵活。基础很简单-特别是如果我们之前和其它编程语言打过叫道-但是由于Swift灵活的语法,如果你对基础不是很了解,函数很容易变得复杂。
在这篇文章里,我们集中于函数的基础,将更复杂的语法和案例放在下一篇文章中。你最好不要跳过这些基础,因为这些基础对于理解Swift中函数强大的来源非常关键。

Learn by Example

函数说明白了,就是一堆代码,当你需要它的时候能够被执行。我乐意以一个简单的例子来讨论Swift函数的基本框架。启动Xcode,创建一个新的playground。码上下面的代码

func printHelloWorld() {
    println("Hello World!")
}

Parameters

func printMessage(message: String) {
    println(message)
}

注意parameters和arguments常常互换使用,但是在swift中,这两个词有语义的不同。parameters式函数定义的时候指定的值,而arguments式函数调用的时候传递的值。

Multiple Parameters

正如我之前提到的,函数的语法非常灵活。

func printMessage(message:String,times:Int){
    for i in 0..<times{
        println("\(i) \(message)")
    }
}

尽管函数的名字和之前的printMessage函数一样,函数的类型式不同的。理解前面的这句非常重要。
每一个函数都有一个类型,类型由参数类型和返回类型构成。我们马上会探索返回类型。函数间可以拥有相同的函数名字,但是函数的类型需要不同。
第一个函数的类型是(String)->(),第二个函数类型是(String,Int)->()。两个函数的名字相同。

Default Values

我最喜欢的特色之一是能够为参数定义默认值。简而言之,Swift允许开发者定义函数参数的默认值。

func printDate(date: NSDate, format: String) {
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = format
    println(dateFormatter.stringFromDate(date))
}

如果你对Foundation framework不熟悉,不了解这个函数体里干了些什么,没啥关系。这个例子不是集中于格式化日期的实现,如果我们在调用这个函数的时候没有传递format参数,Swift不会放过我们。

我们可以通过给函数的第二个参数定义默认值补救

func printDate(date: NSDate, format: String = "YY/MM/dd") {
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = format
    println(dateFormatter.stringFromDate(date))
}

定义默认值很简单,就是在函数定义的参数列表中指定这个值就可以。
但是如果我们想要为format参数传递值呢?让我们试试看,看看Swift怎么告诉我们。

因为format参数有默认值,我们需要传递参数的名字告诉Swift我们指的是哪个参数。修正的方法如下

printDate(NSDate(), format: "dd/MM/YY")

注意Apple建议将有默认值的参数放在参数列表的后面。

Return Type

我们目前看到的函数都不返回任何数据。让我们将上面的printDate函数定义的更加有用,我们让其返回格式化的日子而不是打印这个格式化的日期。

func printDate(date: NSDate, format: String = "YY/MM/dd") -> String {
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = format
    return dateFormatter.stringFromDate(date)
}

我们首先改变的是函数的定义。在参数列表之后我们制定了返回类型,String。返回类型前加上了->符号。
我们使用return关键字将函数运行后的数据返回。

let formattedDate = printDate(NSDate(), format: "dd/MM/YY")

println(formattedDate)

我们调用printDate函数,将返回的值存储在常量formattedDate中。

No Return Type


Swift对于存储没有返回的函数的返回没有任何问题,但它会抱怨,没有办法推测value常量的类型。
这里发生了什么?每一个Swift的函数都返回一个值,即使我们没有在函数定义里定义这个返回类型。当一个函数没有显式地指定返回类型,这个函数隐式地返回Void,这相当于空的元组,即()。
我们可以通过显示的定义value的类型摆脱上面的警告。我同意存储空的元组在常量中没有多大作用,不过它实在阐明了每个函数都有返回值。

    let value:()=printHelloWorld()

Tuples

Swift的另一很棒的特色是能够通过返回元组返回多个值。下面的例子阐明了这是如何工作的。

func timeComponentsForDate(date: NSDate) -> (hour: Int, minute: Int, second: Int) {
    let dateComponents = NSCalendar.currentCalendar().components((.CalendarUnitHour | .CalendarUnitMinute | .CalendarUnitSecond), fromDate: date)
    let hour = dateComponents.hour
    let minute = dateComponents.minute
    let second = dateComponents.second
    return (hour, minute, second)
}

这个函数接受一个实参,返回一个带有三个标签值的元组。给元组的值加标签只是为了方便,你可以省略这些标签。

func timeComponentsForDate(date: NSDate) -> (Int, Int, Int) {
    let dateComponents = NSCalendar.currentCalendar().components((.CalendarUnitHour | .CalendarUnitMinute | .CalendarUnitSecond), fromDate: date)
    let hour = dateComponents.hour
    let minute = dateComponents.minute
    let second = dateComponents.second
    return (hour, minute, second)
}

然而,正如下面的例子所阐述的,给元组的值加标签非常的方便并且可以使你的代码更容易理解

let timeComponents = timeComponentsForDate(NSDate())

println(timeComponents.hour)
println(timeComponents.minute)
println(timeComponents.second)

从函数返回optional value也是可以的。

func timeComponentsForDate(date: NSDate) -> (hour: Int, minute: Int, second: Int)? {
    let dateComponents = NSCalendar.currentCalendar().components((.CalendarUnitHour | .CalendarUnitMinute | .CalendarUnitSecond), fromDate: date)
    let hour = dateComponents.hour
    let minute = dateComponents.minute
    let second = dateComponents.second
    return (hour, minute, second)
}

Conclusion

在这篇教程中,我们集中于Swift中函数的基本,理解函数的语法非常重要,在下面的文章中,我们会探索更高级的函数。
我鼓励你再一次阅读这篇文章,更重要的是,写一写函数来熟悉这些语法,基础很容易理解,但是你只有通过实践才能上手。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值