函數(shù)
函數(shù)的介紹
- 函數(shù)相當(dāng)于OC中的方法
- 函數(shù)的格式如下
func 函數(shù)名(參數(shù)列表) -> 返回值類(lèi)型{
代碼塊
return 返回值
}
- func是關(guān)鍵字,多個(gè)參數(shù)列表之間可以用逗號(hào)(,)分隔,也可以沒(méi)有參數(shù)
- 使用箭頭“->”指向返回值類(lèi)型
- 如果函數(shù)沒(méi)有返回值,返回值為Void.并且“-> 返回值類(lèi)型”部分可以省略
常見(jiàn)的函數(shù)類(lèi)型
// 1.沒(méi)有參數(shù),沒(méi)有返回值
func about() -> Void {
print("iphone")
}
// 調(diào)用函數(shù)
about()
// 簡(jiǎn)單寫(xiě)法
// 如果沒(méi)用返回值,Void可以寫(xiě)成()
func about() -> () {
print("iphone")
}
// 如果沒(méi)有返回值,后面的內(nèi)容可以都不寫(xiě)
func about() {
print("iphone")
}
// 2.有參數(shù),沒(méi)有返回值
func callPhone(phoneNum : String) {
print("打電話給\(phoneNum)")
}
callPhone("+86 120")
// 3.沒(méi)用參數(shù),有返回值
func readMessage() -> String {
return "吃飯了嗎?"
}
var str = readMessage()
print(str)
// 4.有參數(shù),有返回值
func sum(num1 : Int, num2 : Int) -> {
return num1 + num2
}
var result = sum(20, num2 : 30)
print(result)
// 5.有多個(gè)返回值的函數(shù)
let nums = [1, 3, 5, 6, 8, 22]
func getNumCount(nums : [Int]) -> (oddCount : Int, evenCount : Int){
var oddCount = 0
var evenCount = 0
for num in nums {
if num % 2 == 0 {
oddCount++
} else {
evenCount++
}
}
return (oddCount, evenCount)
}
let result = getNumCount(nums)
result.oddCount
result.evenCount
函數(shù)的使用注意
- 注意一:外部參數(shù)和內(nèi)部參數(shù)
- 在函數(shù)內(nèi)部可以看到的參數(shù),就都是內(nèi)部參數(shù)
- 在函數(shù)外部可以看到的參數(shù),就是外部參數(shù)
- 在默認(rèn)情況下,從第二個(gè)參數(shù)開(kāi)始,參數(shù)名稱(chēng)既是內(nèi)部參數(shù),也是外部參數(shù) - 如果第一個(gè)參數(shù)也想要有外部參數(shù),可以設(shè)置標(biāo)簽,在變量名前加標(biāo)簽即可
- 如果不想要外部參數(shù),可以在參數(shù)名稱(chēng)前加_
// num1是外部參數(shù)的名稱(chēng)
func ride(num1 num1 : Int, num2 : Int, num3 : Int) -> Int {
return num1 * num2 * num3
}
var result1 = ride(num1: 20, num2: 4, num3: 5)
// 方法的重載:方法名稱(chēng)相同,但是參數(shù)不同,可以稱(chēng)之為方法的重載
func ride(num1: Int, _ num2 :Int) -> Int {
return num1 * num2
}
var result2 = ride(20, 20)
- 注意二:默認(rèn)參數(shù)
- 某些情況,如果沒(méi)有傳入具體的參數(shù),可以使用默認(rèn)參數(shù)
func makeCoffee(type :String = "卡布奇諾") -> String {
return "制作一杯\(type)咖啡"
}
let coffee1 = makeCoffee("拿鐵")
let coffee2 = makeCoffee()
- 注意三:可變參數(shù)
- swift中函數(shù)的參數(shù)個(gè)數(shù)可以變化,它可以接受不確定數(shù)量的輸入類(lèi)型參數(shù)
- 它們必須具有相同的類(lèi)型
- 我們可以通過(guò)在參數(shù)類(lèi)型后面加入 (...) 的方式來(lái)指示這是可變參數(shù)
func sum(numbers : Double...) -> Double{
//必須初始化
var total: Double = 0
for number in numbers {
total += number
}
return total
}
sum(100.0, 20, 30)
sum(30, 80)
- 注意四:引用類(lèi)型(指針的傳遞)
- 默認(rèn)情況下,函數(shù)的參數(shù)是值傳遞.如果想改變外面的變量,則需要傳遞變量的地址
- 必須是變量,因?yàn)樾枰趦?nèi)部改變其值
- Swift提供的inout關(guān)鍵字就可以實(shí)現(xiàn)
- 對(duì)比下列兩個(gè)函數(shù)
func swap(var a : Int, var b : Int) {
let temp = a
a = b
b = temp
print("a:\(a), b:\(b)")
}
var a = 10
var b = 20
swap(a, b: b)
print("a:\(a), b:\(b)")
// 函數(shù)二:指針的傳遞
func swap1(inout a : Int, inout b : Int) {
let temp = a
a = b
b = temp
print("a:\(a), b:\(b)")
}
swap1(&a, b: &b)
print("a:\(a), b:\(b)")
- 函數(shù)的嵌套使用
- swift中函數(shù)可以嵌套使用
- 即函數(shù)中包含函數(shù),但是不推薦這種寫(xiě)法
// 函數(shù)的嵌套
let value = 55
func test() {
func demo(value : Int) {
print("demo \(value)")
}
print("test")
demo()
}
demo() //錯(cuò)誤
test() //執(zhí)行函數(shù)會(huì)先打印"test",再執(zhí)行demo
函數(shù)的類(lèi)型
- 函數(shù)類(lèi)型的概念
- 每個(gè)函數(shù)都有屬于自己的類(lèi)型,由函數(shù)的參數(shù)類(lèi)型和返回類(lèi)型組成
- 這個(gè)例子中定義了兩個(gè)簡(jiǎn)單的數(shù)學(xué)函數(shù):addTwoInts 和 multiplyTwoInts
- 這兩個(gè)函數(shù)都傳入兩個(gè) Int 類(lèi)型, 返回一個(gè)合適的Int值
- 這兩個(gè)函數(shù)的類(lèi)型是 (Int, Int) -> Int
// 定義兩個(gè)函數(shù)
func addTwoInts(a : Int, b : Int) -> {
return a + b
}
func multiplyTwoInt(a : Int, b : Int) -> {
return a * b
}
- 抽取兩個(gè)函數(shù)的類(lèi)型,并且使用
// 取出函數(shù)
var mathFuncation : (Int : Int) -> Int = addTwoInts
//使用函數(shù)名稱(chēng)
mathFuncation(10, 20)
//給函數(shù)的標(biāo)識(shí)符賦值其他值
mathFunction = multiplyTwoInt
// 使用函數(shù)的名稱(chēng)
mathFunction(10, 20)
// 將函數(shù)的類(lèi)型作為方法的參數(shù)
func printResult(a : Int, b : Int, calculateMethod : (Int, Int) -> Int) {
print(calculateMethod(a, b))
}
printResult(10, b: 20, calculateMethod: addTwoInts)
printResult(10, b: 20, calculateMethod: multiplyTwoInt)
// 1.定義兩個(gè)函數(shù)
func stepForward(num : Int) -> Int {
return num + 1
}
func stepBackward(num : Int) -> Int {
return num - 1
}
// 2.定義一個(gè)變量,希望該變量經(jīng)過(guò)計(jì)算得到0
var num = -4
// 3.蒂尼獲取哪一個(gè)函數(shù)
func getOprationMethod(num : Int) -> (Int) -> Int {
return num <= 0 ? stepForward : stepBackward
}
// 4.while循環(huán)進(jìn)行操作
while num != 0 {
let oprationalMethod = getOprationalMethod(num)
num = oprationalMethod(num)
print(num)
}