Swift - 函數(shù) [注意類(lèi)型的轉(zhuǎn)化]

函數(shù)

函數(shù)的介紹

  • 函數(shù)相當(dāng)于OC中的方法
  • 函數(shù)的格式如下
func 函數(shù)名(參數(shù)列表) -> 返回值類(lèi)型{
    代碼塊
    return 返回值
}
  • func是關(guān)鍵字,多個(gè)參數(shù)列表之間可以用逗號(hào)(,)分隔,也可以沒(méi)有參數(shù)
  • 使用箭頭“->”指向返回值類(lèi)型
  • 如果函數(shù)沒(méi)有返回值,返回值為Void.并且“-> 返回值類(lèi)型”部分可以省略

常見(jiàn)的函數(shù)類(lèi)型

// 1.沒(méi)有參數(shù),沒(méi)有返回值
func about() -> Void {
    print("iphone")
}
// 調(diào)用函數(shù)
about()

// 簡(jiǎn)單寫(xiě)法
// 如果沒(méi)用返回值,Void可以寫(xiě)成()
func about() -> () {
    print("iphone")
}

// 如果沒(méi)有返回值,后面的內(nèi)容可以都不寫(xiě)
func about() {
    print("iphone")
}

// 2.有參數(shù),沒(méi)有返回值
func callPhone(phoneNum : String) {
    print("打電話給\(phoneNum)")
}
callPhone("+86 120")

// 3.沒(méi)用參數(shù),有返回值
func readMessage() -> String {
    return "吃飯了嗎?"
}
var str = readMessage()
print(str)

// 4.有參數(shù),有返回值
func sum(num1 : Int, num2 : Int) -> {
    return num1 + num2
}
var result = sum(20, num2 : 30)
print(result)

// 5.有多個(gè)返回值的函數(shù)
let nums = [1, 3, 5, 6, 8, 22]
func getNumCount(nums : [Int]) -> (oddCount : Int, evenCount : Int){
    var oddCount = 0
    var evenCount = 0
    for num in nums {
        if num % 2 == 0 {
            oddCount++
        } else {
            evenCount++
        }
    }
    return (oddCount, evenCount)
}

let result = getNumCount(nums)
result.oddCount
result.evenCount

函數(shù)的使用注意

  • 注意一:外部參數(shù)和內(nèi)部參數(shù)
    • 在函數(shù)內(nèi)部可以看到的參數(shù),就都是內(nèi)部參數(shù)
    • 在函數(shù)外部可以看到的參數(shù),就是外部參數(shù)
    • 在默認(rèn)情況下,從第二個(gè)參數(shù)開(kāi)始,參數(shù)名稱(chēng)既是內(nèi)部參數(shù),也是外部參數(shù) - 如果第一個(gè)參數(shù)也想要有外部參數(shù),可以設(shè)置標(biāo)簽,在變量名前加標(biāo)簽即可
    • 如果不想要外部參數(shù),可以在參數(shù)名稱(chēng)前加_
// num1是外部參數(shù)的名稱(chēng)
func ride(num1 num1 : Int, num2 : Int, num3 : Int) -> Int {
  return num1 * num2 * num3
}
var result1 = ride(num1: 20, num2: 4, num3: 5)

// 方法的重載:方法名稱(chēng)相同,但是參數(shù)不同,可以稱(chēng)之為方法的重載
func ride(num1: Int, _ num2 :Int) -> Int {
    return num1 * num2
}
var result2 = ride(20, 20)
  • 注意二:默認(rèn)參數(shù)
    • 某些情況,如果沒(méi)有傳入具體的參數(shù),可以使用默認(rèn)參數(shù)
func makeCoffee(type :String = "卡布奇諾") -> String {
    return "制作一杯\(type)咖啡"
}

let coffee1 = makeCoffee("拿鐵")
let coffee2 = makeCoffee()
  • 注意三:可變參數(shù)
    • swift中函數(shù)的參數(shù)個(gè)數(shù)可以變化,它可以接受不確定數(shù)量的輸入類(lèi)型參數(shù)
    • 它們必須具有相同的類(lèi)型
    • 我們可以通過(guò)在參數(shù)類(lèi)型后面加入 (...) 的方式來(lái)指示這是可變參數(shù)
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)
  • 注意四:引用類(lèi)型(指針的傳遞)
    • 默認(rèn)情況下,函數(shù)的參數(shù)是值傳遞.如果想改變外面的變量,則需要傳遞變量的地址
    • 必須是變量,因?yàn)樾枰趦?nèi)部改變其值
    • Swift提供的inout關(guān)鍵字就可以實(shí)現(xiàn)
    • 對(duì)比下列兩個(gè)函數(shù)
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)")

// 函數(shù)二:指針的傳遞
func swap1(inout a : 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)")
  • 函數(shù)的嵌套使用
    • swift中函數(shù)可以嵌套使用
    • 即函數(shù)中包含函數(shù),但是不推薦這種寫(xiě)法
// 函數(shù)的嵌套
let value = 55
func test() {
    func demo(value : Int) {
        print("demo \(value)")
    }

    print("test")
    demo()
}

demo() //錯(cuò)誤
test() //執(zhí)行函數(shù)會(huì)先打印"test",再執(zhí)行demo

函數(shù)的類(lèi)型

  • 函數(shù)類(lèi)型的概念
    • 每個(gè)函數(shù)都有屬于自己的類(lèi)型,由函數(shù)的參數(shù)類(lèi)型和返回類(lèi)型組成
      • 這個(gè)例子中定義了兩個(gè)簡(jiǎn)單的數(shù)學(xué)函數(shù):addTwoInts 和 multiplyTwoInts
      • 這兩個(gè)函數(shù)都傳入兩個(gè) Int 類(lèi)型, 返回一個(gè)合適的Int值
      • 這兩個(gè)函數(shù)的類(lèi)型是 (Int, Int) -> Int
// 定義兩個(gè)函數(shù)
func addTwoInts(a : Int, b : Int) -> {
    return a + b
}

func multiplyTwoInt(a : Int, b : Int) -> {
    return a * b
}
  • 抽取兩個(gè)函數(shù)的類(lèi)型,并且使用
// 取出函數(shù)
var mathFuncation : (Int : Int) -> Int = addTwoInts

//使用函數(shù)名稱(chēng)
mathFuncation(10, 20)

//給函數(shù)的標(biāo)識(shí)符賦值其他值
mathFunction = multiplyTwoInt

// 使用函數(shù)的名稱(chēng)
mathFunction(10, 20)
  • 函數(shù)作為方法的參數(shù)
// 將函數(shù)的類(lèi)型作為方法的參數(shù)
func printResult(a : Int, b : Int, calculateMethod : (Int, Int) -> Int) {
    print(calculateMethod(a, b))
}

printResult(10, b: 20, calculateMethod: addTwoInts)
printResult(10, b: 20, calculateMethod: multiplyTwoInt)
  • 函數(shù)作為方法的返回值
// 1.定義兩個(gè)函數(shù)
func stepForward(num : Int) -> Int {
    return num + 1
}

func stepBackward(num : Int) -> Int {
    return num - 1
}

// 2.定義一個(gè)變量,希望該變量經(jīng)過(guò)計(jì)算得到0
var num = -4

// 3.蒂尼獲取哪一個(gè)函數(shù)
func getOprationMethod(num : Int) -> (Int) -> Int {
 return num <= 0 ? stepForward : stepBackward
}

// 4.while循環(huán)進(jìn)行操作
while num != 0 {
    let oprationalMethod = getOprationalMethod(num)
    num = oprationalMethod(num)
    print(num)
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容