在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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” /*************待续******************************* |
请发表评论