Functions with Multiple Return Values (多个返回值的函数)
可以使用元组类型作为函数的返回值类型,这样可以将多个返回值组成一个复合值来返回.
下面的例子定义了一个叫做count的函数来计算字符串里的字符(元音,辅音和其它字符数量):
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)
}
你可以使用这个count函数计算一个随机字符串的字符个数:
let total = count("some arbitrary string!")
println("(total.vowels) vowels and (total.consonants) consonants")
// prints "6 vowels and 13 consonants”
注意,函数返回的元组中,元素不需要再命名,因为元素的名字已经是函数返回类型的一部分了.
Function Parameter Names (函数参数命名)
前面所有的函数定义了它们的参数名字:
func someFunction(parameterName: Int) {
// function body goes here, and can use parameterName
// to refer to the argument value for that parameter
}
然而,这戏参数名称只用在函数体内部,并且在调用函数的时候不能使用它们.这种方式命名的参数被称为局部参数命名,因为它们只在函数体内部可见.
External Parameter Names (扩展参数命名)
有时候在调用函数时,命名每个参数是非常有用的,这样可以表明每个你要传递给函数的参数目的.
如果你希望在函数调用的时候,使用你函数的用户能提供参数的名称,你可以给每个参数定义一个扩展参数名,为了区别于局部参数名,你要将扩展名写在局部参数名前,并使用空格分 隔:
func someFunction(externalParameterName localParameterName: Int) {
// function body goes here, and can use localParameterName
// to refer to the argument value for that parameter
}
注意点:
如果你使用了参数的扩展命名,那么在调用函数的时候必须都要使用扩展的名字.
看看下面的例子,思考一下这个函数:
func join(s1: String, s2: String, joiner: String) -> String {
return s1 + joiner + s2
}
当你调用这个函数的时候,你传递给函数的三个参数的目的是不清楚的:
join("hello", "world", ", ")
// returns "hello, world”
为了让String的值更明确,定义扩展名给函数里的每个参数:
func join(string s1: String, toString s2: String, withJoiner joiner: String)
-> String {
return s1 + joiner + s2
}
在这个join函数里,第一个参有个String的扩展名和一个局部名s1;第二个参数有个toString扩展名和一个局部名s2;第三个参数的扩展名是withJoiner,局部名为joiner.
现在你可以使用这些扩展名称来调用这个函数,会非常清楚且没有歧义:
join(string: "hello", toString: "world", withJoiner: ", ")
// returns "hello, world
使用扩展命名方式可以使得这个函数在调用的时候更加明白,并且函数体也更具有可读性.
注意点:
如果你的代码在被别人第一次阅读的时候,请考虑是否使用函数的参数扩展命名方式,如果每个参数的目的都非常明确,也没有起义,那么可以不需要使用扩展名.
Shorthand External Parameter Names 扩展命名缩写
如果你想给函数的参数进行扩面命名,但局部参数命名以及有了相近的名称,你就没有必要写两遍,相反,你只写一遍,然后在名字前面使用一个#符号.这会告知Swift使用这个名字既是 扩展名也是局部参数名.
下面的例子定义了一个函数containsCharacter:
func containsCharacter(#string: String, #characterToFind: Character) -> Bool {
for character in string {
if character == characterToFind {
return true
}
}
return false
}
这个函数的参数名在选择上清洗,并在函数体内具有可读性,同时也使得函数在调用的时候没有歧义性:
let containsAVee = containsCharacter(string: "aardvark", characterToFind: "v")
// containsAVee equals true, because "aardvark" contains a "v”
/*************待续*******************************