函數(shù)的介紹
- 函數(shù)相當于OC中的方法
- 函數(shù)的格式如下
func 函數(shù)名(參數(shù)列表) -> 返回值類型 {
代碼塊
return 返回值
}
- func是關鍵字,多個參數(shù)列表之間可以用逗號(,)分隔碎罚,也可以沒有參數(shù)
- 使用箭頭“->”指向返回值類型
- 如果函數(shù)沒有返回值,返回值為Void.并且“-> 返回值類型”部分可以省略
常見的函數(shù)類型
// 1.沒有參數(shù),沒用返回值
func about() -> Void {
print("ios")
}
// 調(diào)用函數(shù)
about()
// 簡單寫法
// 如果沒用返回值,Void可以寫成()
func about1() -> () {
print("iphone")
}
about1()
// 如果沒有返回值,后面的內(nèi)容可以都不寫
func about2() {
print("iphone 2")
}
about2()
// 2.有參數(shù),沒用返回值
func callPhone(phoneNum : String) {
print("打電話給\(phoneNum)")
}
callPhone(phoneNum: "+86 10086")
// 3.沒用參數(shù),有返回值
func readMessage() -> String {
return "吃飯了嗎?"
}
var str = readMessage()
print(str)
// 4.有參數(shù),有返回值
func sum(num1 : Int, num2 : Int) -> Int {
return num1 + num2
}
var result = sum(num1: 20, num2: 30)
print(result)
// 5.有多個返回值的函數(shù)
func getNumCount(nums : [Int]) -> (oddCount : Int, evenCount : Int) {
var oddCount = 0
var evenCount = 0
for num in nums {
if num % 2 == 0 {
oddCount += 1
} else {
evenCount += 1
}
}
return (oddCount, evenCount)
}
let nums = [1, 3, 4, 8, 23]
let result1 = getNumCount(nums: nums)
print(result1.oddCount)
print(result1.evenCount)
函數(shù)的使用注意
- 注意一: 外部參數(shù)和內(nèi)部參數(shù)
- 在函數(shù)內(nèi)部可以看到的參數(shù),就是內(nèi)部參數(shù)
- 在函數(shù)外面可以看到的參數(shù),就是外部參數(shù)
- 默認情況下,從第二個參數(shù)開始,參數(shù)名稱既是內(nèi)部參數(shù)也是外部參數(shù)
- 如果第一個參數(shù)也想要有外部參數(shù),可以設置標簽:在變量名前加標簽即可
- 如果不想要外部參數(shù),可以在參數(shù)名稱前加_
// num1、a鞋邑、b 是外部參數(shù)的名稱
func ride(num1 num1 : Int, a num2 : Int, b num3 : Int) -> Int {
return num1 * num2 * num3
}
var result1 = ride(num1: 20, a: 4, b: 5)
// 方法的重載:方法名稱相同,但是參數(shù)不同,可以稱之為方法的重載(了解)
func ride(num1: Int, _ num2 :Int) -> Int {
return num1 * num2
}
var result2 = ride(num1: 20, 20)
- 注意二: 默認參數(shù)
- 某些情況,如果沒有傳入具體的參數(shù),可以使用默認參數(shù)
func makecoffee(type :String = "卡布奇諾") -> String {
return "制作一杯\(type)咖啡。"
}
let coffee1 = makecoffee(type: "拿鐵")
let coffee2 = makecoffee()
- 注意三: 可變參數(shù)
- swift中函數(shù)的參數(shù)個數(shù)可以變化怨规,它可以接受不確定數(shù)量的輸入類型參數(shù)
- 它們必須具有相同的類型
- 我們可以通過在參數(shù)類型名后面加入(...)的方式來指示這是可變參數(shù)
func sum(numbers:Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total
}
sum(numbers: 10.0, 20, 30)
sum(numbers: 30, 80)
- 注意四: 引用類型(指針的傳遞)
- 默認情況下,函數(shù)的參數(shù)是值傳遞.如果想改變外面的變量,則需要傳遞變量的地址
- 必須是變量,因為需要在內(nèi)部改變其值
- Swift提供的inout關鍵字就可以實現(xiàn)
- 對比下列兩個函數(shù)
// 函數(shù)一:值傳遞
func swap(a : Int, b : Int) {
let temp = a;
a = b;
b = temp
print("a:\(a), b:\(b)")
}
var a = 10
var b = 20
swap(a: a, b: b)
print("a:\(a), b:\(b)")
函數(shù)一在swift3.0中報錯
Playground execution failed: error: MyPlayground.playground:3:7: error: cannot assign to value: 'a' is a 'let' constant
a = b;
~ ^
error: MyPlayground.playground:4:7: error: cannot assign to value: 'b' is a 'let' constant
b = temp
~ ^
正確寫法是函數(shù)二
// 函數(shù)二:指針的傳遞
func swap1(a : inout Int, b : inout Int) {
let temp = a
a = b
b = temp
print("a:\(a), b:\(b)")
}
var a = 10
var b = 20
swap1(a: &a, b: &b)
print("a:\(a), b:\(b)")
- 函數(shù)的嵌套使用
- swift中函數(shù)可以嵌套使用
- 即函數(shù)中包含函數(shù),但是不推薦該寫法
// 函數(shù)的嵌套
let value = 55
func test() {
func demo() {
print("demo \(value)")
}
print("test")
demo()
}
// demo() // 錯誤:demo 是 test 的內(nèi)部函數(shù)陌宿,外部無法調(diào)用
test() // 執(zhí)行函數(shù)會先打印'test',再打印'demo'
函數(shù)的類型
- 函數(shù)類型的概念
- 每個函數(shù)都有屬于自己的類型,由函數(shù)的參數(shù)類型和返回類型組成
- 這個例子中定義了兩個簡單的數(shù)學函數(shù):addTwoInts 和 multiplyTwoInts
- 這兩個函數(shù)都傳入兩個 Int 類型波丰, 返回一個合適的Int值
- 這兩個函數(shù)的類型是 (Int, Int) -> Int
- 每個函數(shù)都有屬于自己的類型,由函數(shù)的參數(shù)類型和返回類型組成
// 定義兩個函數(shù)
func addTwoInts(a : Int, b : Int) -> Int {
return a + b
}
func multiplyTwoInt(a : Int, b : Int) -> Int {
return a * b
}
- 抽取兩個函數(shù)的類型,并且使用
// 定義函數(shù)的類型
var mathFunction : (Int, Int) -> Int = addTwoInts
// 使用函數(shù)的名稱
mathFunction(10, 20) // 30
// 給函數(shù)的標識符賦值其他值
mathFunction = multiplyTwoInt
// 使用函數(shù)的名稱
mathFunction(10, 20) // 200
- 函數(shù)作為方法的參數(shù)
// 將函數(shù)的類型作為方法的參數(shù)
func printResult(a : Int, b : Int, calculateMethod : (Int, Int) -> Int) {
print(calculateMethod(a, b))
}
printResult(a: 10, b: 20, calculateMethod: addTwoInts) // 30
printResult(a: 10, b: 20, calculateMethod: multiplyTwoInt) // 200
- 函數(shù)作為方法的返回值
// 1.定義兩個函數(shù)
func stepForward(num : Int) -> Int {
return num + 1
}
func stepBackward(num : Int) -> Int {
return num - 1
}
// 2.定義一個變量,希望該變量經(jīng)過計算得到0
var num = -4
// 3.定義獲取哪一個函數(shù)
func getOprationMethod(num : Int) -> (Int) -> Int {
return num <= 0 ? stepForward : stepBackward
}
// 4.for循環(huán)進行操作
while num != 0 {
let oprationMethod = getOprationMethod(num: num)
num = oprationMethod(num)
print(num)
}
- 系列文章
01 Swift最基本的語法變化
02 Swift中的變量和常量
03 Swift中的數(shù)據(jù)類型
04 Swift邏輯分支
05 Swift中的循環(huán)
06 Switf中的字符串
07 Swift 數(shù)組
08 Swift字典
09 Swift 元組
10 Swift 可選類型
11 Swift 類型轉(zhuǎn)化
12 Swift 函數(shù)
13 Swift 枚舉類型
14 Swift 結(jié)構(gòu)體
15 Swift 類的定義
16 Swift 類的構(gòu)造函數(shù)
17 Swift 類的析構(gòu)函數(shù)
18 自動引用計數(shù)
19 Swift 可選鏈
20 協(xié)議
21 閉包
22 Swift 懶加載
23 Swift 注釋