函數的介紹
- 函數相當于OC中的方法
- 函數的格式如下
func 函數名(參數清單) -> 傳回值類型 {
代碼塊
return 傳回值
}
-
是關鍵字,多個參數清單之間可以用逗号func
分隔,也可以沒有參數,
- 使用箭頭
指向傳回值類型->
- 如果函數沒有傳回值,傳回值為Void 并且
部分可以省略-> 傳回值類型
常見的函數類型
- 沒有參數,沒有傳回值
func about() -> Void {
print("iPhone Xs Max")
}
// 調用函數
about()
// 簡單寫法
// 如果沒有傳回值,Void可以寫成()
func about1() -> () {
print("iPhone Xs Max")
}
about1()
// 如果沒有傳回值,後面的内容可以都不寫
func about2() {
print("iPhone Xs Max")
}
about2()
- 有參數,沒有傳回值
func call(phoneNum : String) {
print("打電話給\(phoneNum)")
}
call("18888888888")
- 沒有參數,有傳回值
func readMessage() -> String {
return "吃飯了嗎?"
}
var str = readMessage()
print(str)
- 有參數,有傳回值
func sum(num1 : Int, num2 : Int) -> Int {
return num1 + num2
}
var result = sum(num1: 20, num2: 30)
print(result)
- 傳回值為複雜類型
import Foundation
func triple(info:String) -> (name:String, age:Int) {
let infos = info.components(separatedBy: ",")
return (infos[0], Int(infos[1])!)
}
let p:(name:String, age:Int) = triple(info: "zhangsan,20")
p.name
p.age
函數的使用注意
- 注意一: 函數的參數雖然沒有用var和let修飾,但它是常量,不能在函數内修改
func say(message:String) {
//報錯:Cannot assign to value: 'message' is a 'let' constant
message = "Hello Swift"
print("說話内容:\(message)")
}
- 注意二: 每一個函數的形式參數都包含
和形式參數标簽
兩部分形式參數名
- 形式參數标簽用在調用函數的時候
- 形式參數名用在函數的實作當中
- 在調用函數的時候每一個形式參數前邊都要寫形式參數标簽
- 預設情況下,形式參數使用它們的形式參數名作為形式參數标簽
- 如果不想要形式參數标簽,可以在參數名稱前加
_
func minus(num1 a :Int,num2 b:Int) -> Int {
return a - b
}
minus(num1: 5, num2: 2)
func multi(_ a :Int,_ b:Int) -> Int {
return a * b
}
multi(2, 3)
- 注意三: 預設參數
- 某些情況,如果沒有傳入具體的參數,可以使用預設參數
func makecoffee(type :String = "卡布奇諾") -> String {
return "制作一杯\(type)咖啡。"
}
let coffee1 = makecoffee(type: "拿鐵")
let coffee2 = makecoffee()
- 注意四: 可變參數
- Swift中函數的參數個數可以變化,可接受不确定數量的參數
- 參數必須具有相同的類型
- 可以通過在參數類型名後面加入
的方式來訓示可變參數...
func total(numbers:Int...) -> Int {
var sum = 0
for i in numbers {
sum += i
}
return sum
}
total()
total(numbers:10)
total(numbers:10,20)
total(numbers:10,20,30)
- 注意五: 引用類型(指針的傳遞)
- 預設情況下,函數的參數是值傳遞.如果想改變外面的變量,則需要傳遞變量的位址
- Swift提供的
關鍵字可以實作inout
func swapInt(a: inout Int, b: inout Int) {
let tmp = a
a = b
b = tmp
}
var a = 10
var b = 20
print("a=\(a), b=\(b)")
swapInt(a: &a, b: &b)
print("a=\(a), b=\(b)")
- 注意六: 函數的嵌套使用
- Swift中函數可以嵌套使用
- 即函數中包含函數,但是不推薦該寫法
// 函數的嵌套
let value = 55
func test() {
func demo() {
print("demo \(value)")
}
print("test")
demo()
}
demo() // 錯誤
test() // 執行函數會先列印'test',再列印'demo'
函數的類型
- 函數類型的概念
- 函數是引用類型
- 每個函數都有屬于自己的類型,由函數的
參數類型
組成傳回類型
- 有了函數類型以後,就可以把函數類型像Int、Double、Array來用
- 下面的例子中定義了兩個函數:addTwoInts 和 multiplyTwoInts,這兩個函數都傳入兩個 Int 類型參數,傳回一個Int類型值,是以這兩個函數的類型是
(Int, Int) -> Int
// 定義兩個函數
func addTwoInts(a : Int, b : Int) -> Int {
return a + b
}
func multiplyTwoInt(a : Int, b : Int) -> Int {
return a * b
}
- 抽取兩個函數的類型,并且使用
// 定義函數的類型
var mathFunction : (Int, Int) -> Int = addTwoInts
// 使用函數的名稱
mathFunction(10, 20)
// 給函數類型變量指派其他值
mathFunction = multiplyTwoInt
// 使用函數的名稱
mathFunction(10, 20)
- 函數作為函數的參數
// 将函數的類型作為函數的參數
func printResult(a : Int, b : Int, calculateMethod : (Int, Int) -> Int) {
print(calculateMethod(a, b))
}
printResult(a: 10, b: 20, calculateMethod: addTwoInts)
printResult(a: 10, b: 20, calculateMethod: multiplyTwoInt)
- 函數作為函數的傳回值
//定義兩個函數
func addTwoInts(a : Int, b : Int) -> Int {
return a + b
}
func multiplyTwoInt(a : Int, b : Int) -> Int {
return a * b
}
//函數作為傳回值
func getResult(a:Int) -> (Int, Int)->Int{
if a > 10 {
return addTwoInts
}
else{
return multiplyTwoInt
}
}
//調用傳回的函數
getResult(a: 2)(10,20)
getResult(a: 12)(10,20)