Swift 中函數是用來完成特定任務的獨立代碼塊。swift
方法是擁有歸屬關係的函數。數組
函數定義須要關鍵字 func
,其通常格式爲數據結構
func 函數名 (參數名1: 參數類型, 參數名2: 參數類型, ...) -> 函數返回類型 { 函數體 ..... return 返回值 }
參數app
,
分割。返回類型函數
->
來指示。-> Void
(注意 V 要大寫),或者直接省略 ->
語句。Void
。->
後面是 Void
,則函數體中不須要寫 return
語句。函數調用編碼
Swift 中函數自己也是一種類型,函數類型一般由函數的形參類型和返回值類型組成。設計
例如,函數code
func addString(s1: string, s2: string, s2: string) -> String { }
的 函數類型 是排序
(String, String, String) -> String
若是一個函數沒有形參或返回值,那麼這個函數的類型是 () -> ()
。element
能夠像使用 Swift 語言中其餘類型同樣使用函數類型。
例如能夠定義一個函數常量或函數變量,並像通常數據類型指定初始值同樣爲他指定一個對應的函數。與其餘類型同樣,當你給函數賦一個變量或者常量時,你可讓 Swift 語言去推斷函數的類型。
func addString(s1: string, s2: string, s2: string) -> String { } // 指定函數類型 var addSome:(String, String, String) -> String = addString // 推斷函數類型 let addSome = addString
你也能夠將函數做爲參數傳遞給其餘函數,或者將函數類型看成返回類型。
func plus(a: Int, b: Int) -> Int { return a + b } func mult(a: Int, b: Int) -> Int { return a * b } func someFunction(func: (Int, Int) -> Int, a: Int, b: Int) { let result = paraFunc(a, b) print("The result is \(result)") }
someFunction(paraFunc: plus, a: 3, b: 4) // The result is 7 someFunction(paraFunc: mult, a: 3, b: 4) // The result is 12
Swift 語言也能支持 OC 的函數參數標籤模式,這種模式被稱爲外部形參。
_
做爲外部形參名。定義格式
// 使用時本地形參名(本地形參名一、本地形參名2, ...)會被省略 func 函數名 (外部形參名1 本地形參名1: 參數類型, 外部形參名2 本地形參名2: 參數類型, ...) -> 函數返回類型 { 函數體 ..... return 返回值 }
在寫外部形參名時,徹底能夠只寫一次名字,只須要用一個 hash 符號 #
做爲參數名稱的前綴,從而告訴 Swift 咱們使用了名稱相同的本地形參名稱和外部形參名稱。
定義格式
func 函數名 (#參數名1: 參數類型, #參數名2: 參數類型, ...) -> 函數返回類型 { 函數體 ..... return 返回值 }
在 Swift 語言中能夠爲任何形參定義默認值以做爲函數定義的一部分。
定義格式
func 函數名 (參數名1: 參數類型, 參數名2: 參數類型, 默認值形參名: 參數類型 = 默認值) -> 函數返回類型 { 函數體 ..... return 返回值 }
當不能肯定調用函數須要傳入具體參數的數量時,應使用可變形參。
可變形參是指可接受零個或多個指定類型值的形參,能夠用它來傳遞任意數量的輸入參數。
...
。定義格式
func 函數名 (參數名1: 參數類型, 參數名2: 參數類型, 可變形參名: 參數類型...) -> 函數返回類型 { 函數體 ..... return 返回值 }
可變數量形參的使用
func arithmeticmean(numbers: Double...) -> Double { var total: Double = 0 for number in numbers { total += number } return total / Double(numbers.count) }
print(arithmeticmean(numbers: 1, 2, 3)) // 2.0 print(arithmeticmean(numbers: 1, 2, 3, 4, 5)) // 3.0
Swift 語言函數的形參默認是常量,咱們不能直接在函數體內部改變形參的值,也就是說函數的形參默認是值類型的。
可是若是須要在函數體內部修改函數參數值,可使用可變參數,
雖然在 Swift 2.2 中仍舊可使用這個語法,可是在 Swift 3.0 中這種寫法已經被廢棄了,若是須要修改參數的值,能夠在函數體內建立新的成員變量。
定義格式
func 函數名 (var 參數名1: 參數類型, var 參數名2: 參數類型, ...) -> 函數返回類型 { 函數體 ..... return 返回值 }
在實際的編碼中,咱們每每須要在函數體內部修改形參值,並同時做用到實參自己,從而省去增長返回值數量的步驟。
inout
關鍵字修飾。inout
關鍵字修飾。定義格式
// Swift 3.0 以前 func 函數名 (inout 參數名1: 參數類型, 參數名2: 參數類型, ...) { 函數體 ..... }
// Swift 3.0 及以後 func 函數名 (參數名1: inout 參數類型, 參數名2: 參數類型, ...) { 函數體 ..... }
使用 in-out 參數的同時有幾條規則須要注意
var
、let
、inout
。inout
。引用形參的使用
func exampleOfFunction(parameter: inout String) -> String { parameter = "Hello \(parameter)" return parameter }
var name = "xiaoming" print(exampleOfFunction(parameter: &name)) // Hello xiaoming print(name) // Hello xiaoming
在一個函數體中定義另一個函數體就稱爲嵌套函數。
定義格式
func 函數名1 (參數名1: 參數類型, 參數名2: 參數類型, ...) -> 函數返回類型1 { func 函數名2 (參數名3: 參數類型, 參數名4: 參數類型, ...) -> 函數返回類型2 { 函數體2 ..... return 返回值2 } 函數體1 ..... return 返回值1 }
在 Swift 中函數重載十分經常使用。
==
,若是想讓本身定義的數據結構可使用某個操做符,那麼能夠對操做符進行重載。參數列表重載的使用
func test(s: Int) -> Int { print("Int") return 1 } // 修改參數名 func test(a: Int) -> Int { print("String") return 2 } // 修改參數類型 func test(s: String) -> Int { print("String") return 3 }
let intValue = test(s: 0) // 1 let intValue = test(a: 0) // 2 let stringValue = test(s: "") // 3
返回值重載的使用
func test(s: String) -> Int { print("Int") return 3 } // 修改返回值類型 func test(s: String) -> String { print("String") return s }
let intValue : Int = test(s: "") // 3 let stringValue: String = test(s: "") // ""
若是寫出下面的代碼編譯器會提示你明確 unKnow 的類型。
let unKnow = test(s: "")
操做符重載的使用
struct BoxInt { var intValue: Int } func == (lhs: BoxInt, rhs: BoxInt) -> Bool { return lhs.intValue == rhs.intValue }
let b1 = BoxInt(intValue: 1) let b2 = BoxInt(intValue: 2) print(b1 == b2) // false
Swift 3.0 以後,函數風格發生了較大的變化,這主要是受 Swift 3.0 提出的 API 設計原則的影響。
1)縮減函數名
從 Swift 3.0 開始,函數的首個參數名再也不默認被隱藏,你能夠把函數的方法名縮減,把關鍵字轉移到首個參數的參數名上。
// Swift 3.0 以前 arr.appendContentsof([4, 5]) // Swift 3.0 及以後 arr.append(contentsOf: [4, 5])
2)用 「時態」 表示函數 「反作用」
在一般的認知中,函數應該是 「無狀態」 的,也就是說,不管調用多少次都能獲得相同的結果,可是,有時候函數體內部也會修改函數外部的成員值。
var mutableArr = [1, 3, 2] // 在 Swift 3.0 以前,sort 方法叫作 sortInPlace mutableArr.sort() // sorted 是 sort 的反作用版本 let immutableArr = mutableArr.sorted()
sort
是動詞時態,表明這個方法沒有反作用,也就是說,sort
方法只會對方法的調用者起做用,是一種原地排序。sorted
是 sort
方法的反作用版本,sorted
方法不會修改原數組,會把原數組拷貝後排序,而且返回排序好的數組,你能夠把返回值理解成一種反作用。3)關鍵字能夠用做參數名
從 Swift 3.0 開始,大多數 Swift 關鍵字均可以被用做參數名。
func index(for element: Int, in collection: [Int]) -> Int? { for (num, e) in collection.enumerated() { if e == element { return num } } return nil }
index(for: 3, in: [1, 2, 2, 2, 3]) // 4
for-in
關鍵字本來是用在循環中,在這裏被用做函數的外部參數名。