iOS Swift基礎(chǔ)學(xué)習(xí)筆記(二)函數(shù)(Function)和閉包(Closure)

使用func來聲明一個(gè)函數(shù)。通過在函數(shù)名后面添加包含參數(shù)列表的圓括號來執(zhí)行函數(shù)。使用->來分離參數(shù)和返回類型。

func greet(person: String, day: String) -> String {
    return "Hello \(person), today is \(day)."
}
greet(person: "Bob", day: "Tuesday")

練習(xí):刪除day參數(shù),添加一個(gè)參數(shù)表示今天中午吃了什么午飯。

func greet(person: String, lunch: String) -> String
{
    return "Hello \(person), I eat \(lunch) today."
}
greetWithLunch(person: "Jack", lunch: "sandwich")

默認(rèn)情況下,函數(shù)使用它們的參數(shù)名稱作為其參數(shù)的標(biāo)簽。在參數(shù)名稱前寫入自定義參數(shù)標(biāo)簽,或者寫入_表示使用無參數(shù)標(biāo)簽。

func greet(_ person: String, on day: String) -> String {
    return "Hello \(person), today is \(day)."
}
greet("John", on: "Wednesday")

使用元組(tuple)來返回多個(gè)值。元組的元素可以通過名稱或索引來訪問。

func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) {
    var min = scores[0]
    var max = scores[0]
    var sum = 0
    
    for score in scores {
        if score > max {
            max = score
        } else if score < min {
            min = score
        }
        sum += score
    }
    return (min, max, sum)
}
let statistics = calculateStatistics(scores: [5, 3, 100, 50, 8])
print(statistics.sum)
print(statistics.2)

函數(shù)可以有可變長度的參數(shù),通過數(shù)組來包含它們。

func sumOf(numbers: Int...) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return sum
}
sumOf()
sumOf(numbers: 42, 583, 23)

練習(xí):寫一個(gè)函數(shù)來求傳入?yún)?shù)的平均值。

func averageOf(numbers: [Int]) -> Int {
    var average = 0
    var sum = 0
    
    for number in numbers {
        sum += number
    }
    average = sum / numbers.count
    return average
}
averageOf(numbers: [45, 32, 19, 65, 84])

函數(shù)可以嵌套。嵌套函數(shù)可以訪問在外部函數(shù)中聲明的變量。你可以使用嵌套函數(shù)來包裝冗長和復(fù)雜的代碼。

func returnFifteen() -> Int {
    var y = 10
    func add() {
        y += 5
    }
    add()
    return y
}
returnFifteen()

函數(shù)是一級類型。這意味著在一個(gè)函數(shù)中可以返回另一個(gè)函數(shù)。

func makeIncrementer() -> ((Int) -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }
    return addOne
}
makeIncrementer()
var increment = makeIncrementer()
increment(7)

一個(gè)函數(shù)可以將另一個(gè)函數(shù)作為它的參數(shù)。

func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
    for item in list {
        if condition(item) {
            return true
        }
    }
    return false
}

func lessThanTen(number: Int) -> Bool {
    return number < 10
}

var numbers = [20, 18, 7, 11]
hasAnyMatches(list: numbers, condition: lessThanTen)

函數(shù)實(shí)際上是一種特殊的閉包:可以在之后調(diào)用的代碼塊。閉包中的代碼可以訪問在創(chuàng)建閉包的域(scope)中可用的變量和函數(shù),即使閉包在執(zhí)行時(shí)處于不同的域。你可以通過使用花括號({})包裝一段代碼來創(chuàng)建一個(gè)匿名閉包。使用in來分離閉包代碼塊與參數(shù)、返回類型。

numbers.map({
    (number: Int) -> Int in
    let result = 3 * number
    return result
})

練習(xí):重寫閉包來為所有奇數(shù)返回0。

numbers.map({
    (number: Int) -> Int in
    var odd = number % 2
    if odd != 0 {
        return 0
    } else {
        return number
    }
})

有一些簡潔的辦法來創(chuàng)建閉包。當(dāng)閉包的類型已知,比如一個(gè)代理的回調(diào),你可以忽略它的參數(shù)或者返回值,或者兩者都忽略。單一語句的閉包隱式地返回語句值。

let mappedNumbers = numbers.map({number in 3 * number})
print(mappedNumbers)

你可以通過數(shù)字而不是名字來引用一個(gè)參數(shù)——這個(gè)方法在特別短小的閉包里非常實(shí)用。作為函數(shù)的最后一個(gè)參數(shù)傳遞的閉包可以緊跟在圓括號后面。 當(dāng)閉包是函數(shù)的唯一參數(shù)時(shí),可以完全省略圓括號。

let sortedNumbers = numbers.sorted {$0 > $1}
print(sortedNumbers)

參考蘋果官方文檔

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

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

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