Swift 函數的理解

Swift.png
函數的簡單說明
  • 函數是一段完成特定任務的獨立代碼片段。
  • 在定義一個函數時,有多個或者一個數據類型的值,作為函數的輸入,成為參數
  • 在一定某個類型的值作為返回值的時候,成為返回類型
  • func作為前綴,指定函數的返回類型時,用返回箭頭-> 后跟返回類型的名稱的方式表示
//表示如下:
func 函數名(參數1:參數類型,參數2:參數類型,參數3:參數類型...) -> 返回值類型 {
    代碼塊
    return 返回值
}

注意: 函數的參數默認是 let類型,不可以修改的,如果想要修改,必須使用inout關鍵字 就是后面說的 引用類型指針傳遞

函數參數與返回值
  • 無參數無返回值的函數
func hanshu() -> Void {
    
    print("沒有參數,沒有返回值");
}

hanshu();
//打印結果: 沒有參數,沒有返回值

//簡寫的 沒有返回值的話  直接簡寫

func hanshu(){
    
    print("沒有參數,沒有返回值");
}

hanshu();

//注意:嚴格上來說,雖然沒有返回值被定義,hanshu() 函數依然返回了值。沒有定義返回類型的函數會返回一 個特殊的 Void 值。它其實是一個空的元組(tuple),沒有任何元素,可以寫成()。


  • 無參數有返回值的函數
func sayHello() ->String {
    
    return "hello 你好";
}

let hello = sayHello();
print(hello);
//打印結果: hello 你好

  • 有參數 沒有返回值
//name:參數名 String:參數類型
func personName(name:String) {
    
    print("我是\(name),哈哈");
}

personName(name: "CC");

//打印結果:我是CC,哈哈
  • 有參數 有返回值,多個參數用 , 分開
func sum(num1:Int,num2:Int,num3:Int) -> Int {
    
    return  num1+num2 + num3;
}

let numSum = sum(num1: 10, num2: 20, num3: 30);
print(numSum);

//打印結果:60

  • 返回一組數據的函數 多重返回值函數
//元祖 是保存一組數據的,這個函數 返回值是一個  元祖
func tulpNum(PersonName:String,PersonAge:Int,PersonSex:String) -> (name:String,age:Int,sex:String){
    
    
    return (PersonName,PersonAge,PersonSex);
}


let tulp =  tulpNum(PersonName: "CC", PersonAge: 20, PersonSex: "男");
tulp.name;
//打印是 “CC

//參數是數組 返回是元祖
 func minMax(array: [Int]) -> (min: Int, max: Int) {
     var currentMin = array[0]
     var currentMax = array[0]
     for value in array[1..<array.count] {
         if value < currentMin {
             currentMin = value
         } else if value > currentMax {
             currentMax = value
} }
     return (currentMin, currentMax)
 }


let arrayTulp = minMax(array: [1,2,3,10,5,9]);

print(arrayTulp.min);
print(arrayTulp.max);
//打印結果是 : min是:1
              max是:10 

函數參數標簽參數名稱
  • 指定參數標簽
    • 可以在函數名稱前指定它的參數標簽,中間以空格分隔
func someFunction(argumentLabel  parameterName: Int) { 
// 在函數體內,   parameterName 代表參數值
}

//  from 參數標簽
func greet(person: String, from hometown: String) -> String {
    return "Hello \(person)!  Glad you could visit from \(hometown)."
}
print(greet(person: "Bill", from: "Cupertino"))
// 打印 "Hello Bill! Glad you could visit from Cupertino."




  • 忽略參數標簽
    • 不希望為某個參數添加一個標簽,可以使用一個下劃線( _ )來代替一個明確的參數標簽。
func someFunction(_ firstParameterName: Int, secondParameterName: Int) {
// 在函數體內,firstParameterName 和 secondParameterName 代表參數中的第一個和第二個參數值
}
someFunction(1, secondParameterName: 2)
  • 默認參數
    • 某些情況,如果沒有傳入具體的參數,可以使用默認參數
func makecoffee(type :String = "卡布奇諾") -> String {
    return "制作一杯\(type)咖啡。"
}

let coffee1 = makecoffee("拿鐵")
// "制作一杯拿鐵咖啡。"
let coffee2 = makecoffee()
// 打印:"制作一杯卡布奇諾咖啡。
  • 可變參數
    • swift中函數的參數個數可以變化,它可以接受不確定數量的輸入類型參數
    • 它們必須具有相同的類型
    • 我們可以通過在參數類型名后面加入(...)的方式來指示這是可變參數

注意:一個函數,最多只能有一個可變參數,緊跟在可變參數后面的參數不能省略參數標簽

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)
//注意: 一個函數最多只能擁有一個可變參數。
  • 引用類型(指針的傳遞)
    • 默認情況下,函數的參數是值傳遞.如果想改變外面的變量,則需要傳遞變量的地址
    • 必須是變量,因為需要在內部改變其值
    • Swift提供的inout關鍵字就可以實現
 // 函數一:值傳遞
  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)")


  // 函數二:指針的傳遞
  func swap1(a:inout  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)")


函數的類型
// 函數類型 (Int, Int, Int) -> Int

//函數類型: 參數類型 和返回值類型 組成
func sum(num1:Int,num2:Int,num3:Int) -> Int {

    return  num1+num2 + num3;
}


//函數類型作為參數
func exen(n1:Int,n2:Int,n3:Int,fun:(Int,Int,Int) -> Int) -> Void{
    
    let result = fun(n1,n2,n3);
    print(result);
    
}

exen(n1: 10, n2: 10, n3:30,fun: sum);


//函數類型作為返回值


func getFunc() -> (Int,Int,Int) -> Int{
    return sum;
}
let value1 = getFunc();
value1(20,30,20);

//打印: 70

//函數類型 作為 類的屬性




//編輯器根據
 1.函數的名稱分別函數
 2.根據外部參數名稱 分別函數
3.根據 參數類型 + 返回值類型 = 函數類型 來區別


函數重載

  • 函數名相同
  • 參數個數不同 || 參數不同 || 參數標簽不同
//函數名相同  參數標簽不同
func f1(v1:Int,v2:Int){
    print(v1 + v2);
}

func f1(v3:Int,v4:Int){
    print(v3 + v4);
}

內聯函數

  • 內聯函數: 在函數調用的時候, 把其展開成函數體,直接執行
  • 以下函數是不會內聯的
    • 函數體過長
    • 包含遞歸函數
    • 包含動態派發

在Swift中的項目中,如果在打包函數或者調試中使用Release模式,

image.png
image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,238評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,430評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,134評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,893評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,653評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,136評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,212評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,372評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,888評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,738評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,939評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,482評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,179評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,588評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,829評論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,610評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,916評論 2 372

推薦閱讀更多精彩內容

  • 函數是用來完成特定任務的獨立的代碼塊。給一個函數起一個合適的名字,用來標識函數做什么,并且當函數需要執行的時候,這...
    窮人家的孩紙閱讀 813評論 2 1
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,781評論 18 139
  • 定義和調用函數 在下面的例子中的函數叫做greet(person :),因為這是它的作用 - 它需要一個人的名字作...
    Joker_King閱讀 284評論 0 1
  • 函數是用來完成特定任務的獨立的代碼塊。可以給函數起一個名字,用于標識一個函數,當函數需要執行的時候,這個名字就會用...
    EndEvent閱讀 744評論 1 3
  • 圖文|王學藝 五、四、三……綠燈提示行將開始! 我驀然從沉思中下意識拿出手機,打開打開拍照,定格這生活瞬間被觸動的...
    王學藝閱讀 935評論 14 17