函數(shù)
(1)Swift定義函數(shù)使用關(guān)鍵字func碎紊,->后定義函數(shù)的返回值類型。
fun runoob (site: String, name: String) -> String {
return (site)
}
print(runoff (site: "66666"))
無(wú)參數(shù)的函數(shù)
func funcname () -> String{
return datatype
}
無(wú)返回值的函數(shù)
func getNet (getwork:String){
print("hhh")
}
(2)元組作為函數(shù)返回值
注:元組與數(shù)組類似琅绅,但是元組中的值可以是任意類型离咐,使用的是方括號(hào)》罴可選元組類型如(Int, Int)?與元組包含可選類型如(Int?, Int?)是不同的.可選的元組類型,整個(gè)元組是可選的昆著,而不只是元組中的每個(gè)元素值县貌。
func minMax (array: [Int]) -> (min: Int, max: Int)? {
if array.isEmpty {
return nil
}
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)
}
(3)函數(shù)的內(nèi)部參數(shù)名和外部參數(shù)名,如果聲明了外部參數(shù)名凑懂,則在調(diào)用函數(shù)的時(shí)候必須使用外部參數(shù)名
func pow(first a: Int, second b: Int)->Int{
return (a+b)
}
var strr = pow(first:10, second:8)
print(star)
(4)可變參數(shù)煤痕,可接受0或多個(gè)值,在類型后加...來(lái)定義
func fun<M>(remeber: M...){
for i in remeber {
print(i)
}
}
(5)常量,變量及I/O參數(shù)
在函數(shù)的參數(shù)前面加inout關(guān)鍵字摆碉,就可以改變參數(shù)的值塘匣,傳入?yún)?shù)時(shí)需要在參數(shù)前面加&符,表示這個(gè)值可以被修改巷帝。
func swapTwo(a: inout Int, b: inout Int){
let tempA = a
a=b
b=tempA
}
var x = 1
var y = 5
swapTwo(a: &x, b: &y)
(6)使用函數(shù)類型忌卤,就像定義其他類型的值一樣
func sum(a: Int, b: Int) -> Int {
return a+b
}
var addition: (Int, Int) -> Int = sum
// 接下來(lái)就可以使用addition調(diào)用函數(shù)
(7)函數(shù)類型作為參數(shù)類型,返回類型
func sum(a: Int, b: Int) -> Int {
return a+b
}
var addition: (Int, Int) -> Int = sum
func another (addition: (Int, Int) -> Int,a: Int, b: Int){
print(addition(a, b))
}
another(addition: sum, a: 10, b: 30)
(8)嵌套函數(shù)楞泼,外部的函數(shù)可以調(diào)用內(nèi)部定義的函數(shù)
// 以函數(shù)作為返回值的嵌套函數(shù)
func calcDecrement (forDecrement total: Int) -> Int{
var overallDecrement = 0
func decrementer() -> Int{
overallDecrement -= total
return overallDecrement
}
return decrementer()
}
閉包
(1)閉包的形式有:
全局函數(shù) : 有名字但不能捕獲任何值驰徊。
嵌套函數(shù) : 有名字,也能捕獲封閉函數(shù)內(nèi)的值堕阔。
閉包表達(dá)式 : 無(wú)名閉包棍厂,使用輕量級(jí)語(yǔ)法,可以根據(jù)上下文環(huán)境捕獲值超陆。
(2)閉包語(yǔ)法實(shí)例:
let studname = { print("Swift 閉包實(shí)例牺弹。") }
studname()
//以下閉包形式接收兩個(gè)參數(shù)并返回布爾值:
let divide = {(val1: Int, val2: Int) -> Int in
return val1 / val2
}
let result = divide(200, 20)
print (result)
(3)閉包表達(dá)式
含義:閉包表達(dá)式是一種利用簡(jiǎn)潔語(yǔ)法構(gòu)建內(nèi)聯(lián)閉包的方式。 閉包表達(dá)式提供了一些語(yǔ)法優(yōu)化时呀,使得撰寫閉包變得簡(jiǎn)單明了张漂。
sorted方法:
sorted(by:) 方法,會(huì)根據(jù)您提供的用于排序的閉包函數(shù)將已知類型數(shù)組中的值進(jìn)行排序。返回一個(gè)與原數(shù)組相同(排序后)的數(shù)組退唠,原數(shù)組不會(huì)被修改鹃锈。
sorted(by:)方法需要傳入兩個(gè)參數(shù):
已知類型的數(shù)組
閉包函數(shù),該閉包函數(shù)需要傳入與數(shù)組元素類型相同的兩個(gè)值瞧预,并返回一個(gè)布爾類型值來(lái)表明當(dāng)排序結(jié)束后傳入的第一個(gè)參數(shù)排在第二個(gè)參數(shù)前面還是后面屎债。如果第一個(gè)參數(shù)值出現(xiàn)在第二個(gè)參數(shù)值前面,排序閉包函數(shù)需要返回 true垢油,反之返回 false盆驹。
實(shí)例:
let names = ["AT", "AE", "D", "S", "BE"]
// 使用普通函數(shù)(或內(nèi)嵌函數(shù))提供排序功能,閉包函數(shù)類型需為(String, String) -> Bool。
func backwards(s1: String, s2: String) -> Bool {
return s1 > s2
}
var reversed = names.sorted(by: backwards)
print(reversed)
(4)參數(shù)名稱縮寫
可以直接通過$0,$1,$2來(lái)順序調(diào)用閉包的參數(shù)滩愁。
實(shí)例:
let names = ["AT", "AE", "D", "S", "BE"]
var reversed = names.sorted( by: { $0 > $1 } )
print(reversed)
(5)運(yùn)算符函數(shù)
實(shí)例:
let names = ["AT", "AE", "D", "S", "BE"]
var reversed = names.sorted(by: >)
print(reversed)
(6)尾隨閉包
格式:
func someFunctionThatTakesAClosure(closure: () -> Void) {
// 函數(shù)體部分
}
// 以下是不使用尾隨閉包進(jìn)行函數(shù)調(diào)用
someFunctionThatTakesAClosure({
// 閉包主體部分
})
// 以下是使用尾隨閉包進(jìn)行函數(shù)調(diào)用
someFunctionThatTakesAClosure() {
// 閉包主體部分
}
實(shí)例:
let names = ["AT", "AE", "D", "S", "BE"]
//尾隨閉包
var reversed = names.sorted() { $0 > $1 }
print(reversed)
(7)捕獲值
閉包可以在其定義的上下文中捕獲常量或變量躯喇。
即使定義這些常量和變量的原域已經(jīng)不存在,閉包仍然可以在閉包函數(shù)體內(nèi)引用和修改這些值硝枉。
實(shí)例:
func makeIncrementor(forIncrement amount: Int) -> () -> Int {
var runningTotal = 0
func incrementor() -> Int {
runningTotal += amount
return runningTotal
}
return incrementor
}
let incrementByTen = makeIncrementor(forIncrement: 10)
// 返回的值為10
print(incrementByTen())
// 返回的值為20
print(incrementByTen())
// 返回的值為30
print(incrementByTen())
由于沒有修改amount變量廉丽,incrementor實(shí)際上捕獲并存儲(chǔ)了該變量的一個(gè)副本,而該副本隨著incrementor一同被存儲(chǔ)妻味。
所以我們調(diào)用這個(gè)函數(shù)時(shí)會(huì)累加
(8)閉包是引用類型
如果您將閉包賦值給了兩個(gè)不同的常量/變量正压,兩個(gè)值都會(huì)指向同一個(gè)閉包。
實(shí)例:
func makeIncrementor(forIncrement amount: Int) -> () -> Int {
var runningTotal = 0
func incrementor() -> Int {
runningTotal += amount
return runningTotal
}
return incrementor
}
let incrementByTen = makeIncrementor(forIncrement: 10)
// 返回的值為10
incrementByTen()
// 返回的值為20
incrementByTen()
// 返回的值為30
incrementByTen()
// 返回的值為40
incrementByTen()
let alsoIncrementByTen = incrementByTen
// 返回的值也為50
print(alsoIncrementByTen())
本文只是我在菜鳥教程上學(xué)習(xí)的一些自認(rèn)為關(guān)鍵性的總結(jié)责球,如有需要請(qǐng)前往菜鳥教程學(xué)習(xí)焦履。