根據是否具備返回值,函數能夠分爲無返回值函數和有返回值函數。如下將會對這兩種函數類型進行講解。程序員
開發者但願在函數中返回某一數據類型的值,必需要在函數聲明定義時爲函數設定一個返回的數據類型,並使用return語句進行返回。其中,return語句的通常表示形式以下:編程
return 表達式數組
其中,表達式能夠是符合Swift標準的任意表達式。而具備返回值的函數聲明定義形式以下:函數
func 函數名(參數列表)->返回值類型{spa
語句.net
return 表達式orm
}排序
其中,返回的表達式類型必須和函數的返回值類型一致。教程
【示例7-13】如下代碼計算某一數值範圍的長度,並返回輸出。代碼以下:ip
import Foundation
func range(start:Int,end:Int)->Int{
return end-start
}
let a=range(0, end: 10)
print(a)
在代碼中,指定函數的返回值類型爲Int,而return表達式爲end-start。運行結果以下所示:
10
在Swift中,函數不只能夠返回一個返回值,還能夠返回多個,這時就須要使用到元組類型。其語法形式以下:
func count(參數列表) -> (返回值1:數據類型, 返回值2:數據類型, 返回值3:數據類型,…) {
……
return (返回值1,返回值2,返回值3,…)
}
【示例7-14】下面就獲取在一個字符串中得元音、輔音以及其它的個數。代碼以下:
import Foundation
func count(string: String) -> (vowels: Int, consonants: Int, others: Int) {
var vowels = 0, consonants = 0, others = 0
for character in string.characters {
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 str="Hello Swift!"
let number=count(str)
print("\(number.vowels)元音\n\(number.consonants)輔音\n\(number.others)其它")
運行結果以下所示:
3元音
7輔音
2其它
在具備多個返回值的函數須要注意如下2點:
1.返回值個數一致
在->後面的返回值類型的個數要和return中的返回值個數一致,不然程序就會出現錯誤。如如下的代碼,將示例7-14中的代碼作了修改:
func count(string: String) -> (vowels: Int, consonants: Int, others: Int) {
var vowels = 0, consonants = 0, others = 0
…
return (vowels, consonants)
}
在此代碼中能夠知道,->後面的返回值類型有3個,可是return中得返回值有2個,它們的個數不同,致使程序出現如下的錯誤:
Tuple types '(@lvalue Int, @lvalue Int)' and '(vowels: Int, consonants: Int, others: Int)' have a different number of elements (2 vs. 3)
2.返回值順序
在->後面的返回值類型要和return中的返回值類型的順序一致,不然程序就會出現錯誤。如如下的代碼,將示例7-14中的代碼作了修改:
func count(string: String) -> (vowels: Int, consonants: Int, others: Int) {
var vowels = 0, consonants = 0, others = 0
…
return (vowels,others,consonants)
}
在此代碼中,->後面的返回值爲(vowels: Int, consonants: Int, others: Int),return中的返回值爲(vowels,others,consonants)因爲它們的數據類型相同都是整型,因此在改變它們的位置後,程序不會出現錯誤。運行結構以下:
3元音
2輔音
7其它
函數除了有有返回值類型外,還有沒有返回值的類型。在第7.2、7.3、7.4節中所講的都是沒有返回值的函數類型。沒有返回值的類型不須要定義返回值類型,而且也不須要出現return語句。若是出現return語句,反而會形成程序錯誤。例如如下的代碼,它的功能是輸出某一數字。
import Foundation
func printaa(a:Int){
return a
}
let num=9
let number=printaa(num)
print(number)
在此函數中,它是沒有返回值的,可是在函數中又使用了renturn語句返回了a的值,因此致使程序出現瞭如下的錯誤信息:
'Int' is not convertible to '()'
在Swift中,每個函數都是一個特定的類型,這種類型被稱爲函數類型。它由參數類型和返回值類型構成。例如如下代碼就是一個具備參數類型和返回值類型的函數:
func add(a: Int, b: Int) -> Int {
return a + b
}
在該代碼中,定義了一個實現加法運算的數學函數add。此函數接受了兩個Int整型的參數,執行相應的數學運算後,返回一個Int整型值做爲結果。這個函數的類型就是(Int,Int)->Int,程序員能夠理解爲函數類型有兩個Int整型參數,並返回一個Int整型值。在Swift除了有具備參數列表和返回值類型的函數外,還有不帶參數和返回值類型的函數,如如下代碼是一個不帶參數和返回值的函數:
func printHelloWorld(){
print("Hello,World")
}
函數printHelloWorld()的類型是()->()。因爲函數沒有參數,返回void,因此該類型在Swift中至關於一個空元組,也能夠簡化爲()。
做爲一種類型,程序員能夠像任何其餘類型同樣使用函數類型。基本語法以下:
let/var 常量名/變量名:函數類型=函數名
或者
let/var 常量名/變量名=函數名
【示例7-15】如下將使用一個mathFunction變量引用函數add。代碼以下:
import Foundation
func add(a: Int, b: Int) -> Int {
return a + b
}
var mathFunction: (Int, Int) -> Int = add
print(mathFunction(2,8))
在代碼中定義了一個mathFunction變量,並將該變量的類型設定爲函數類型。它接受了兩個Int整型值,並返回了一個Int整型值。使用這個新的變量mathFunction來引用add函數的功能。運行結果以下所示:
10
因爲Swift具備自動推斷類型的能力,因此能夠在聲明變量後直接賦值,不須要單個爲變量去聲明類型,因此以上的爲變量賦值的代碼能夠改寫爲:
var mathFunction = add
若是不一樣函數具備相同的函數類型,這時把它們賦值給同一個變量。例如,在以上的代碼中在添加一個函數:
func multiply(a:Int,b:Int)->Int{
return a*b
}
因爲mathFunction變量和multiply的類型匹配,因此能夠直接賦值,並輸出,代碼以下:
mathFunction=multiply
print(mathFunction(3,8))
代碼以下所示:
10
24
開發者可使用函數類型做爲另外一個函數的參數類型。例如如下代碼,它的功能是讓個數進行相加或者相乘,而後輸出。代碼以下:
import Foundation
//兩數相加
func add(a: Int, b: Int) -> Int {
return a + b
}
//兩數相乘
func multiply(a:Int,b:Int)->Int{
return a*b
}
//輸出結果
func printresult(fun:(Int,Int)->Int,a:Int,b:Int){
print(fun(a,b))
}
printresult(add, a: 3, b: 2)
printresult(multiply, a: 3, b: 2)
在此代碼中定義了三個函數。第三個函數printresult中,有三個參數:第一個參數爲fun,類型爲(Int,Int)->Int,開發者能夠傳入任何這種類型的函數;第二個參數和第三個參數分別爲a和b,它們的類型都是Int型,這兩個值是函數的輸入值。當第一次調用printresult函數時,它傳入了add函數和3、5兩個整數。這時,它又會調用函數add,將3、5做爲函數add的輸入值,並輸出結果。第二此調用也相似,printresult會調用multiply函數。最後的運行結果以下所示:
5
6
函數類型不只能夠被用做參數外,還能夠被用做返回值類型。此時須要在->後面寫入一個完整的函數類型,其語法形式以下:
func 函數名(參數列表) -> 函數類型 {
…
}
【示例7-16】如下代碼輸出經過給定的值,出現一系列的值;若是給定的值大於0輸出從這個數開始到0之間的數;若是是負數,一直輸出比這個是小1的數。代碼以下:
import Foundation
//返回一個比輸入值大1得值
func stepForward(input: Int) -> Int {
return input + 1
}
//返回一個比輸入值小1得值
func stepBackward(input: Int) -> Int {
return input - 1
}
//選擇返回哪一個函數
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
return backwards ? stepBackward : stepForward
}
var currentValue = 5
let moveNearerToZero = chooseStepFunction(currentValue>0)
while currentValue != 0 {
print("\(currentValue)... ")
currentValue = moveNearerToZero(currentValue)
}
在此代碼中定義了3個函數。第三個函數chooseStepFunction的返回值類型是(Int)->Int。運行結果以下所示:
5...
4...
3...
2...
1...
Swift2.0中的標準函數
函數除了能夠根據參數列表的有無分爲無參函數和有參函數,還能夠從定義角度分爲用戶自定義函數和標準函數兩種。以上的示例都是用戶自定函數。Swift提供了74個標準函數,這些函數均可以直接去使用,不須要進行定義。本節將針對經常使用的標準函數進行詳細的講解。
abs()函數的功能是求數值的絕對值。其語法形式以下:
abs(數值)
函數的返回值是一個零或者正數。
【示例7-17】如下將使用abs()函數獲取-10、10、0、-1.233、1.233的絕對值。代碼以下:
import Foundation
//求整數的絕對值
let value1=abs(-10)
let value2=abs(10)
let value3=abs(0)
//求浮點數的絕對值
let value4=abs(-1.233)
let value5=abs(1.233)
print("value1=\(value1)")
print("value2=\(value2)")
print("value3=\(value3)")
print("value4=\(value4)")
print("value5=\(value5)")
在此代碼中,正數的絕對值是它自己;負數的絕對值爲正數;0的絕對值還爲0。運行結果以下:
value1=10
value2=10
value3=0
value4=1.233
value5=1.233
注意:abs()中的參數必須是數值,不能夠是數值之外的東西,如字符、字符串等。如如下的代碼,將獲取字符串"aaa"的絕對值。代碼以下:
import Foundation
let value1=abs("aaa")
print("value1=\(value1)")
因爲abs()的參數爲字符串致使程序出現瞭如下錯誤:
Cannot find an overload for 'abs' that accepts an argument list of type '(String)'
在編程中,常常須要計算幾個參數的最大值或者最小值,此時可使用標準函數中的max()和min()函數實現。如下是對這兩個函數的詳細講解。
1.獲取最大值
max()函數能夠獲取幾個參數的最大值。其語法形式以下:
max(參數1,參數2,參數3,…)
其中,參數能夠是數值,也能夠是字符串或字符。
【示例7-18】如下將使用max()函數,依次獲取1.9和10的最大值,13.8、20、88.88的最大值以及字符串"Hello"、"Swift"、"Zone"的最大值。代碼以下:
import Foundation
let maxValue1=max(1.9,10)
let maxValue2=max(13.8,20,88.88)
let maxValue3=max("Hello","Swift","Zone")
print("maxValue1=\(maxValue1)")
print("maxValue2=\(maxValue2)")
print("maxValue3=\(maxValue3)")
在對字符串進行比較時,是對字符串中的字符進行比較。首先會判斷3個字符的首字符哪一個大。若是找到最大的字符,就以此字符開頭的字符串爲最大值;若是判斷的3個首字符相同,那麼在進行第二個字符的比較,以此類推。運行結果以下:
maxValue1=10.0
maxValue2=88.88
maxValue3=Zone
2.獲取最小值
min()函數能夠獲取幾個參數的最小值。其語法形式以下:
min(參數1,參數2,參數3,…)
其中,參數一樣能夠是數值、字符串或字符。
【示例7-19】如下將使用min()函數,獲取1.9和10的最小值,獲取13.8、20、88.88的最小值,字符串"Swift"、"Hello"、"iOS"的最小值。代碼以下:
import Foundation
let minValue1=min(1.9,10)
let minValue2=min(13.8,20,88.88)
let minValue3=min("Swift","Hello","iOS")
print("minValue1=\(minValue1)")
print("minValue2=\(minValue2)")
print("minValue3=\(minValue3)")
運行結果以下:
minValue1=1.9
minValue2=13.8
minValue3=Hello
注意:在使用max()、min()時若是是數值,比較的參數都是數值。若是是字符或者字符串,比較的參數也是字符或者字符串。不能夠在一個函數中同時比較數值和字符串、字符。如下的代碼將比較1.9、10和字符串"Hello"的最小值。代碼以下:
import Foundation
let minValue=min(1.9,10,"Hello")
println("minValue=\(minValue)")
在此代碼中,因爲min()函數對數值和字符串進行比較,致使程序出現瞭如下的錯誤:
Cannot find an overload for 'min' that accepts an argument list of type '(Double, Int, String)'
在一個序列中,每每須要獲取元素的最大值或者最小值。此時可使用maxElement()和minElement()函數。如下是對這兩個函數的詳細講解。
1.序列的最大值
maxElement()函數獲取一個序列中最大值的元素。其語法形式以下:
序列.maxElement()
其中,序列能夠是數值,也能夠是一個範圍。
【示例7-20】下面使用maxElement()函數獲取序列sequence1、sequence2和範圍1...100中最大值的元素。代碼以下:
import Foundation
let sequence1=[9,8,2,3]
let sequence2=["Ad","Ab","Ac"]
let maxValue1=sequence1.maxElement()!
print("maxValue1=\(maxValue1)")
let maxValue2=(1...100).maxElement()!
print("maxValue2=\(maxValue2)")
let maxValue3=sequence2.maxElement()!
print("maxValue3=\(maxValue3)")
其中,字符串構成的序列sequence2的判斷方式與函數max()相同,都是依次比較字符串的字母大小。運行結果以下:
maxValue1=9
maxValue2=100
maxValue3=Ad
2.序列的最小值
minElement()函數能夠獲取一個序列中最小值的元素。其語法形式以下:
序列.minElement()
其中,序列能夠是數值,也能夠是一個範圍。
【示例7-21】如下將使用minElement()函數獲取序列sequence1、sequence2和範圍1...100中最小值的元素。代碼以下:
import Foundation
let sequence1=[9,8,2,3]
let sequence2=["Ad","Ab","Ac"]
let minValue1=sequence1.minElement()!
print("minValue1=\(minValue1)")
let minValue2=(1...100).minElement()!
print("minValue2=\(minValue2)")
let minValue3=sequence2.minElement()!
print("minValue3=\(minValue3)")
運行結果以下:
minValue1=2
minValue2=1
minValue3=Ab
contains()函數能夠判斷一個序列中是否包含指定的元素。其語法形式以下:
序列.contains(元素)
其中,函數的返回值類型爲布爾類型。當返回true時,表示表達序列中包含指定的元素;當返回false時,表示不包含。
【示例7-22】如下代碼使用contains()函數函數判斷序列languages中是否包含元素"Swift"和"Java"。代碼以下:
import Foundation
var languages = ["Swift", "Objective-C","C"]
//判斷在languages數組中是否包含"Swift"字符串
if languages.contains("Swift") == true {
print("languages序列中包含元素「Swift」")
}else{
print("languages序列中不包含元素「Swift」")
}
//判斷在languages數組中是否包含"Java"字符串
if languages.contains("Java") == true {
print("languages序列中包含元素「Java」")
}else{
print("languages序列中不包含元素「Java」")
}
在此代碼languages中"Swift"、"Objective-C"、"C"這三個元素,可是沒有"Java"元素。運行結果以下:
languages序列中包含元素「Swift」
languages序列中不包含元素「Java」
在比較的時候,會區分字母的大小寫。因此,不一樣大小寫的字符串是不一樣的。
在編程中,常常須要對序列中元素的進行排序。此時可使用Swift中的sortInPlace()函數來實現。其語法形式以下:
序列.sortInPlace()
其中,序列是指數組。
【示例7-23】如下將使用sort()函數對languages和value數組進行排序。代碼以下:
import Foundation
var languages = ["Swift", "Objective-C","C"]
print("排序前:languages=\(languages)")
languages.sortInPlace()
print("排序後:languages=\(languages)")
運行結果以下:
排序前:languages=[Swift, Objective-C, C]
排序後:languages=[C, Objective-C, Swift]
reverse()函數能夠將序列中元素的倒序排列。其語法形式以下:
序列.reverse()
其中,序列是指數組。
【示例7-24】如下將使用reverse 函數對序列languages和value進行倒序排列。代碼以下:
import Foundation
var languages = ["Swift", "Objective-C","C"]
print("languages=\(languages)")
print("倒序輸出:")
for i in Array(languages.reverse()){
print(i)
}
var value = [1,8,4,10]
print("value=\(value)")
print("倒序輸出:")
for i in Array(value.reverse()){
print(i)
}
運行結果以下:
languages=[Swift, Objective-C, C]
倒序輸出:
C
Objective-C
Swift
value=[1, 8, 4, 10]
倒序輸出:
10
4
8
1
本文選自:Swift2.0語言快速入門v3.0 大學霸內部資料,轉載請註明出處,尊重技術尊重IT人!