不知道不觉, 我们的Swift基础语法已经说了四分之一了, 下面让我们继续来看看:


1.定义和调用函数

在我们的Swift中, 也有定义函数和调用函数的方法, 和OC中的形式不太一样, 但本质都是相同的, 下面让我们来看看例子:

func sayHello(personName: String) -> String {
    let greeting = "Hello, " + personName + "!"
    return greeting
}

var a = sayHello("xiaoming")

println(a)
// 打印出来的结果: Hello, xiaoming!

PS: 在例子中的func关键字是声明函数必须得加上的, sayHello是函数名, (personName: String)说明函数里有一个参数名叫做personName, 它的类型是String类型, ->String的意思是指该函数返回的类型是一个String类型, 而声明的变量 a 就是用来调用sayHello该方法的, 而括号里所传入的就是该函数的参数内容.


2.多输入形参

在Swift中定义的函数同样是支持多形参输入, 比如:

func halfOpenRangeLength(start: Int, end: Int) -> Int {
    return end - start
}
println(halfOpenRangeLength(1, 10))
// 打印出来的结果: 9

PS: 在这个函数里, 有两个形参, 分别都是Int类型.


3.无形参数

同样的, 和OC一样, Swift也允许函数没有形参, 比如:

func sayHelloWorld() -> String {
    return "hello, world"
}
println(sayHelloWorld())
// 打印出来的结果: hello, world

4.无返回值函数

在Swift中, 和OC一样, 同样允许函数没有返回值, 比如:

func sayGoodbye(personName: String) {
    println("Goodbye, \(personName)!")
}
sayGoodbye("Dave")
// 打印出来的结果: Goodbye, Dave

5.多返回值函数

在Swift中, 我们可以声明多个类型的返回值, 元组就是一个最好的例子了, 比如:

func count(string: String) -> (vowels: Int, consonants: Int, others: Int) {
    var vowels = 0, consonants = 0, others = 0
    for character in string {
    switch String(character).lowercaseString {
        case "a", "e", "i", "o", "u":
            ++vowels
        case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m","n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
            ++consonants
        default:
            ++others
        }
    }
    return (vowels, consonants, others)
}

let total = count("some arbitrary string!")
println("\(total.vowels) vowels and \(total.consonants) consonants, others is \(total.others).")
// 打印出来的结果: 6 vowels and 13 consonants, others is 3.

6.函数形参名

在OC或者Swift中, 我们都会给形参设定一个形参名, 比如:

func someFunction(parameterName: Int) {
}

PS: 形参名为someFunction.


7.外部形参名

除了这种方法定义形参名之外, 还有另一种方式, 就是外部形参名:

func someFunction(externalParameterName localParameterName: Int) {
    println(localParameterName)
}

var a: () = someFunction(externalParameterName: 10)
// 打印出来的结果: 10

PS: 这个就和我们在OC中定义的形参类似, 但书写格式必须得以空格隔开, “( 空格 )”.


8.外部参数名称速记

外部参数名称还有另一种快速记住的方法, 那就是在每个外部参数名称前加个 “( # )” 号, 比如:

func containsCharacter(#string: String, #characterToFind: Character) -> Bool {
    for character in string {
        if character == characterToFind {
            return true
        }
    }
    return false
}

var a = containsCharacter(string: "abcdefg", characterToFind: "a")
println(a)
// 打印出来的结果: true

这样子我们就不需要写两个形参名, 可以提高我们开发效率.


9.默认形参值

func join(string s1: String, toString s2: String, withJoiner joiner: String = " ") -> String {
    return s1 + joiner + s2
}

var a = join(string: "Hello", toString: "World", withJoiner: " - ")
println(a)
// 打印出来的结果: Hello - World

PS: 这是我们自己设定的withJoiner函数内容, 所以使得两个字符串的拼接中间会有 “( -) ” 该符号, 但如果我们不设定的话, 就会默认我们声明时用的 “( 空格 )”.

比如:

func join(string s1: String, toString s2: String, withJoiner joiner: String = " ") -> String {
    return s1 + joiner + s2
}

var a = join(string: "Hello", toString: "World")
println(a)
// 打印出来的结果:Hello World

10.有默认值的外部形参名

还有一个例子, 就是有默认值的外部形参名, 下面是我们定义的:

func join(s1: String, s2: String, joiner: String = " ") -> String {
    return s1 + joiner + s2
}

var a = join("Hello", "World", joiner: " - ")
println(a)
// 打印出来的结果: Hello - World

下面是默认的:

func join(s1: String, s2: String, joiner: String = " ") -> String {
    return s1 + joiner + s2
}

var a = join("Hello", "World")
println(a)
// 打印出来的结果: Hello World

和我们前面讲解外部形参类似, 只是添加了一个默认返回值是 “( 空格 )”的参数.


好了, 这次我们就讲到这里, 下次我们继续~~~