介紹
Swift 函數(shù)與 javascript 和 C# 的函數(shù)寫法很像,但和 Objective-C 的方法卻大大不一樣。Swift 的函數(shù)經(jīng)過歷代版本的優(yōu)化也已逐漸成型,寫法大同小異,話不多說,直接上代碼
函數(shù)的定義
- 常規(guī)函數(shù)定義(有參數(shù)也有返回值)
override func viewDidLoad() {
super.viewDidLoad()
print(sum(a : 10, b : 5))
}
// 格式 函數(shù)名(形參1,形參2...) -> 返回值類型
func sum(a : Int, b : Int) -> Int {
return a + b
}
以上代碼為 Swift 4.0 的語法。 Swift 4.0 的語法沒有改動(dòng),依然延續(xù)了 Swift 3.0 的規(guī)則。在 Swift 2.0 中略有區(qū)別,調(diào)用語法格式為:sum(10, b : 5),少了第一個(gè)參數(shù)的形參看起來有些不倫不類。
- 使用外部參數(shù)定義函數(shù)
override func viewDidLoad() {
super.viewDidLoad()
print(sum(number1 : 10, number2 : 5))
}
func sum(number1 a : Int, number2 b : Int) -> Int {
return a + b
}
所謂的外部參數(shù)就是在形參前加一個(gè)替代形參的別名,這個(gè)外部參數(shù)不會(huì)影響函數(shù)內(nèi)部的細(xì)節(jié)。通過添加外部參數(shù)來定義函數(shù)可以使調(diào)用者更加直觀的理解傳參的類型,不需要再去源文件里查看,減少開發(fā)時(shí)間成本。
- 定義函數(shù)并忽略形參名稱
override func viewDidLoad() {
super.viewDidLoad()
print(sum(10, 5))
}
func sum(_ a : Int, _ b : Int) -> Int {
return a + b
}
外部參數(shù)使用 “_” 表示在外部調(diào)用該函數(shù)時(shí)忽略形參名稱。
結(jié)果輸出:

函數(shù)的定義結(jié)果輸出
- 定義無返回值函數(shù)的三種方式
override func viewDidLoad() {
super.viewDidLoad()
demo1()
demo2()
demo3()
}
func demo1() {
print("直接省略返回值")
}
func demo2() -> () {
print("使用()表示空?qǐng)?zhí)行")
}
func demo3() -> Void {
print("使用 Void 關(guān)鍵字表示無返回值")
}
輸出結(jié)果:

無返回值函數(shù)輸出結(jié)果
- 定義函數(shù)的默認(rèn)值
override func viewDidLoad() {
super.viewDidLoad()
print(sum())
print(sum(a : 100))
print(sum(b : 50))
print(sum(a: 20, b : 5))
}
func sum(a : Int = 5, b : Int = 10) {
return a + b
}
默認(rèn)值結(jié)果輸出:

有默認(rèn)值函數(shù)的輸出
- 類方法(函數(shù))的定義
Objective-C的程序員對(duì)于實(shí)例方法和類方法并不陌生,在Objective-C中定義實(shí)例方法使用-,定義類方法使用+,在Swift中類方法的定義更明確一些,必須使用class或者static修飾。用法為:在class類中定義類方法可以使用class或static修飾,在struct或enum中只能使用static。
class Calculators {
/// 使用 static 修飾類方法
static func calculator(number1 a: Int, number2 b: Int) -> Int {
return a + b
}
/// 使用 class 修飾類方法
class func calculator1(number1 a: Int, number2 b: Int) -> Int {
return a + b
}
}
class ViewController : UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
print(Calculators.calculator(number1: 10, number2: 5))
print(Calculators.calculator1(number1: 10, number2: 5))
}
}

類方法輸出結(jié)果
代碼正常輸出,說明在類(
class)中定義類方法使用 class 或者 static 并沒有什么區(qū)別,但在定義結(jié)構(gòu)體的時(shí)候會(huì)有明確的指示:
在 struct 中使用class修飾的報(bào)錯(cuò)提示
在
struct 使用 class 修飾符會(huì)報(bào)編譯錯(cuò)誤 Class methods are only allowed within classes; use 'static' to declare a static method。在開發(fā)中要有區(qū)分的使用。
總結(jié)
-
Swift的函數(shù)比Objective-C的方法更加靈活,代碼量可以大大縮減; -
Swift函數(shù)定義的方式都有一定的規(guī)范func 函數(shù)名(參數(shù)1, 參數(shù)2,....) 返回類型。