12 Swift 函數(shù)

函數(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ù)
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)
 }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末壳坪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子掰烟,更是在濱河造成了極大的恐慌爽蝴,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纫骑,死亡現(xiàn)場離奇詭異蝎亚,居然都是意外死亡,警方通過查閱死者的電腦和手機先馆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門颖对,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人磨隘,你說我怎么就攤上這事」嘶迹” “怎么了番捂?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長江解。 經(jīng)常有香客問我设预,道長,這世上最難降的妖魔是什么犁河? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任鳖枕,我火速辦了婚禮,結(jié)果婚禮上桨螺,老公的妹妹穿的比我還像新娘宾符。我一直安慰自己,他們只是感情好灭翔,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布魏烫。 她就那樣靜靜地躺著,像睡著了一般肝箱。 火紅的嫁衣襯著肌膚如雪哄褒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天煌张,我揣著相機與錄音呐赡,去河邊找鬼。 笑死骏融,一個胖子當著我的面吹牛链嘀,可吹牛的內(nèi)容都是我干的萌狂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼管闷,長吁一口氣:“原來是場噩夢啊……” “哼粥脚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起包个,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤刷允,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后碧囊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體树灶,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年糯而,在試婚紗的時候發(fā)現(xiàn)自己被綠了天通。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡熄驼,死狀恐怖像寒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瓜贾,我是刑警寧澤诺祸,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站祭芦,受9級特大地震影響筷笨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜龟劲,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一胃夏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧昌跌,春花似錦仰禀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至审胸,卻和暖如春亥宿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背砂沛。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工烫扼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碍庵。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓映企,卻偏偏與公主長得像悟狱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子堰氓,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容