亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

Swift心得筆記之函數(shù)

2020-03-09 17:50:46
字體:
供稿:網(wǎng)友
函數(shù)是執(zhí)行特定任務(wù)的代碼自包含塊。通過給定一個函數(shù)名稱標(biāo)識它是什么,并在需要的時候使用該名稱來調(diào)用函數(shù)以執(zhí)行任務(wù)。今天我們就來探討下swift中的函數(shù)問題。
 

參數(shù)

外部變量名

一般情況下你可以不指定外部變量名,直接調(diào)用函數(shù):

 

復(fù)制代碼代碼如下:

func helloWithName(name: String, age: Int, location: String) {
    println("Hello /(name). I live in /(location) too. When is your /(age + 1)th birthday?")
}
helloWithName("Mr. Roboto", 5, "San Francisco")

 

但是在類 (或者結(jié)構(gòu)、枚舉) 中的時候,會自動分配外部變量名 (第一個除外) ,這時候如果還想直接調(diào)用就會報錯了:

 

復(fù)制代碼代碼如下:

class MyFunClass {  
    func helloWithName(name: String, age: Int, location: String) {
        println("Hello /(name). I live in /(location) too. When is your /(age + 1)th birthday?")
    }
}
let myFunClass = MyFunClass()
myFunClass.helloWithName("Mr. Roboto", 5,  "San Francisco")

 

如果你懷念在 OC 中定義函數(shù)名的方式,可以繼續(xù)這樣定義,比如 helloWithName 這種,隱藏第一個函數(shù)的外部名:

 

復(fù)制代碼代碼如下:

class MyFunClass {
    func helloWithName(name: String, age: Int, location: String) {
        println("Hello /(name). I live in /(location) too. When is your /(age + 1)th birthday?")
    }
}
let myFunClass = MyFunClass()
myFunClass.helloWithName("Mr. Roboto", age: 5, location: "San Francisco")

 

如果你實在不想要外部變量名,那么可以用 _ 來代替:

 

復(fù)制代碼代碼如下:

struct Celsius {
    var temperatureInCelsius: Double
    init(fromFahrenheit fahrenheit: Double) {
        temperatureInCelsius = (fahrenheit - 32.0) / 1.8
    }
    init(fromKelvin kelvin: Double) {
        temperatureInCelsius = kelvin - 273.15
    }
    init(_ celsius: Double) {
        temperatureInCelsius = celsius
    }
}
let boilingPointOfWater = Celsius(fromFahrenheit: 212.0)
// boilingPointOfWater.temperatureInCelsius 是 100.0
let freezingPointOfWater = Celsius(fromKelvin: 273.15)
// freezingPointOfWater.temperatureInCelsius 是 0.0
let bodyTemperature = Celsius(37.0)
// bodyTemperature.temperatureInCelsius 是 37.0 

 

對外部參數(shù)名的嫻熟應(yīng)用可以極好的抽象初始化過程??梢钥纯?json-swift library 中的應(yīng)用。

默認(rèn)參數(shù)值

可以在函數(shù)定義里寫上函數(shù)的默認(rèn)值,這樣在調(diào)用的時候可以不傳這個值:

 

復(fù)制代碼代碼如下:

func add(value1 v1:Int, value2 p1:Int = 2) -> Int{
    return v1 + p1
}
add(value1: 2, value2: 4)   // 2 + 4
add(value1: 1)  // 1 + 2

 

如果你沒有提供外部參數(shù)名,設(shè)置默認(rèn)參數(shù)值會自動提供默認(rèn)參數(shù)名。

可變參數(shù)

可變參數(shù) (Variadic Parameters) 可以接受一個以上的參數(shù)值。比如計算平均數(shù):

 

復(fù)制代碼代碼如下:

func arithmeticMean(numbers: Double...) -> Double {
    var total: Double = 0
    for number in numbers { // numbers is [Double]
        total += number
    }
    return total / Double(numbers.count)
}
arithmeticMean(1, 2, 3, 4, 5)
arithmeticMean(3, 8, 19)

 

如果不止一個參數(shù),需要把可變參數(shù)放在最后,否則會報錯。應(yīng)該這樣:

 

復(fù)制代碼代碼如下:

func sumAddValue(addValue:Int=0, numbers: Int...) -> Int {
    var sum = 0
    for number in numbers { // numbers === [Int]
        sum += number + addValue
    }
    return sum
}
sumAddValue(addValue: 2, 2,4,5) // (2+2) + (4+2) + (5+2) = 17

 

常量和變量參數(shù)

默認(rèn)參數(shù)是常量,無法在函數(shù)體中改變參數(shù)值。我們可以 var 一個新的值就行操作,也可以直接在函數(shù)定義中加上 var 避免在函數(shù)體中定義新的變量。

比如這一個右對齊函數(shù):

 

復(fù)制代碼代碼如下:

func alignRight(var string: String, count: Int, pad: Character) -> String {
    let amountToPad = count - countElements(string)
    if amountToPad < 1 {
        return string
    }
    let padString = String(pad)
    for _ in 1...amountToPad {
        string = padString + string
    }
    return string
}
let originalString = "hello"
let paddedString = alignRight(originalString, 10, "-")  // "-----hello"

 

輸入輸出參數(shù) (inout)

在函數(shù)體中對變量參數(shù)進(jìn)行的修改并不會改變參數(shù)值本身,比如看這個例子:

 

復(fù)制代碼代碼如下:

func add(var v1:Int) -> Int {
    return ++v1
}
var a = 1
add(a)      // 2
a           // 1

 

如果想通過函數(shù)修改原始值需要 inout ,但是這樣是錯誤的:

 

復(fù)制代碼代碼如下:

func add(inout v1:Int) -> Int {
    return ++v1
}
var a = 1
add(a)      // 2
a           // 1

 

在傳入的時候,需要加上 & 標(biāo)記:

 

復(fù)制代碼代碼如下:

func add(inout v1:Int) -> Int {
    return ++v1
}
var a = 1
add(&a)      // 2
a           // 1

 

泛型參數(shù)類型

在此借用一下 objc.io 中的例子來演示泛型參數(shù)類型的使用:

 

復(fù)制代碼代碼如下:

// 交換兩個值的函數(shù)
func valueSwap<T>(inout value1: T, inout value2: T) {
    let oldValue1 = value1
    value1 = value2
    value2 = oldValue1
}
var name1 = "Mr. Potato"
var name2 = "Mr. Roboto"
valueSwap(&name1, &name2)   // 交換字符串
name1 // Mr. Roboto
name2 // Mr. Potato
var number1 = 2
var number2 = 5
valueSwap(&number1, &number2)   // 交換數(shù)字
number1 // 5
number2 // 2

 

函數(shù)類型

在 Swift 中,函數(shù)翻身把歌唱,終于成了一等公民,和其他類型平起平坐。

變量

我們可以定義一個變量,這個變量的類型是函數(shù)類型:

 

復(fù)制代碼代碼如下:

func addTwoInts(a: Int, b: Int) -> Int {
    return a + b
}
let anotherMathFunction = addTwoInts
anotherMathFunction(1,2)    // 3

 

參數(shù)

函數(shù)既然是類型的一種,那么顯然也是可以作為參數(shù)傳遞的:

 

復(fù)制代碼代碼如下:

func addTwoInts(a: Int, b: Int) -> Int {
    return a + b
}
func printMathResult(mathFunction: (Int, Int) -> Int, a: Int, b: Int) {
    println("Result: /(mathFunction(a, b))")
}
printMathResult(addTwoInts, 3, 5)   // 將參數(shù)2和參數(shù)3作為參數(shù)傳給參數(shù)1的函數(shù)

 

返回值

函數(shù)也是可以作為結(jié)果返回的。比如返回的值是一個參數(shù)為 Int 返回值為 Int 的函數(shù),就是這樣定義:func foo() -> (Int) -> Int??梢钥聪旅孢@個具體的例子:

 

復(fù)制代碼代碼如下:

func stepForward(input: Int) -> Int {
    return input + 1
}
func stepBackward(input: Int) -> Int {
    return input - 1
}
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
    return backwards ? stepBackward : stepForward
}
var currentValue = 3
let moveNearerToZero = chooseStepFunction(currentValue > 0) // 根據(jù)參數(shù)返回 stepForward 或 stepBackward
println("Counting to zero:")
while currentValue != 0 {
    println("/(currentValue)... ")
    currentValue = moveNearerToZero(currentValue)
}
println("zero!")
// 3...
// 2...
// 1...
// zero!

 

別名

用多了會發(fā)現(xiàn)在一大串 ()-> 中又穿插各種 ()-> 是一個非常蛋疼的事情。我們可以用 typealias 定義函數(shù)別名,其功能和 OC 中的 typedef 以及 shell 中的 alias 的作用基本是一樣的。舉個例子來看下:

 

復(fù)制代碼代碼如下:

import Foundation
typealias lotteryOutputHandler = (String, Int) -> String
// 如果沒有 typealias 則需要這樣:
// func luckyNumberForName(name: String, #lotteryHandler: (String, Int) -> String) -> String {
func luckyNumberForName(name: String, #lotteryHandler: lotteryOutputHandler) -> String {
    let luckyNumber = Int(arc4random() % 100)
    return lotteryHandler(name, luckyNumber)
}
luckyNumberForName("Mr. Roboto", lotteryHandler: {name, number in
    return "/(name)'s' lucky number is /(number)"
})
// Mr. Roboto's lucky number is 33

 

嵌套

但是其實并不是所有的函數(shù)都需要暴露在外面的,有時候我們定義一個新函數(shù)只是為了封裝一層,并不是為了復(fù)用。這時候可以把函數(shù)嵌套進(jìn)去,比如前面這個例子:

 

復(fù)制代碼代碼如下:

func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
    func stepForward(input: Int) -> Int { return input + 1 }
    func stepBackward(input: Int) -> Int { return input - 1 }
    return backwards ? stepBackward : stepForward
}
var currentValue = -4
let moveNearerToZero = chooseStepFunction(currentValue < 0)
// moveNearerToZero now refers to the nested stepForward() function
while currentValue != 0 {
    println("/(currentValue)... ")
    currentValue = moveNearerToZero(currentValue)
}
println("zero!")
// -4...
// -3...
// -2...
// -1...
// zero!

 

柯里化 (currying)

柯里化背后的基本想法是,函數(shù)可以局部應(yīng)用,意思是一些參數(shù)值可以在函數(shù)調(diào)用之前被指定或者綁定。這個部分函數(shù)的調(diào)用會返回一個新的函數(shù)。

這個具體內(nèi)容可以參見 Swift 方法的多面性 中 柯里化部分的內(nèi)容。我們可以這樣調(diào)用:

 

復(fù)制代碼代碼如下:

class MyHelloWorldClass {
    func helloWithName(name: String) -> String {
        return "hello, /(name)"
    }
}
let myHelloWorldClassInstance = MyHelloWorldClass()
let helloWithNameFunc = MyHelloWorldClass.helloWithName
helloWithNameFunc(myHelloWorldClassInstance)("Mr. Roboto")
// hello, Mr. Roboto

 

多返回值

在 Swift 中我們可以利用 tuple 返回多個返回值。比如下面這個例子,返回所有數(shù)字的范圍:

 

復(fù)制代碼代碼如下:

 func findRangeFromNumbers(numbers: Int...) -> (min: Int, max: Int) {
    var maxValue = numbers.reduce(Int.min,  { max($0,$1) })
    var minValue = numbers.reduce(Int.max,  { min($0,$1) }) 
    return (minValue, maxValue)
}
findRangeFromNumbers(1, 234, 555, 345, 423)
// (1, 555)

 

而返回值未必都是有值的,我們也可以返回可選類型的結(jié)果:

 

復(fù)制代碼代碼如下:

import Foundation
func componentsFromUrlString(urlString: String) -> (host: String?, path: String?) {
    let url = NSURL(string: urlString)
    return (url?.host, url?.path)
}
let urlComponents = componentsFromUrlString("http://why/233;param?foo=1&baa=2#fragment")
switch (urlComponents.host, urlComponents.path) {
case let (.Some(host), .Some(path)):
    println("host /(host) and path /(path)")
case let (.Some(host), .None):
    println("only host /(host)")
case let (.None, .Some(path)):
    println("only path /(path)")
case let (.None, .None):
    println("This is not a url!")
}
// "host why and path /233/param"

 

以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。



注:相關(guān)教程知識閱讀請移步到swift教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
亚洲欧洲日本在线| 日韩综合另类| av电影在线观看完整版一区二区| 日韩在线视频第一页| 精品成在人线av无码免费看| 久久久久久欧美精品se一二三四| 91在线精品秘密一区二区| 国产黄色av免费看| 97在线日本国产| 最新av在线播放| 欧美一区精品| 亚洲欧美国产日韩中文字幕| 一区二区三区成人| aⅴ在线视频男人的天堂| 2012中文字幕在线视频| 91久久国产精品| 欧美日韩一区中文字幕| 亚洲在线激情| 国产欧美在线播放| 欧美激情一区二区三区免费观看| 欧美老头gaygay1069| 久久久噜久噜久久综合| h在线观看网站| 黄网站免费在线| 9久久9毛片又大又硬又粗| 91久久精品国产91性色69| 欧美日韩日日夜夜| 国产精品久久久午夜夜伦鲁鲁| 国产亚洲欧美在线视频| 国产精品久久久久久久久久东京| 日本韩国在线视频| 黄色一级视频在线观看| 91精品久久久久久9s密挑| 久久久国产在线视频| 久久久久久国产精品视频| 人妻无码中文字幕免费视频蜜桃| 91精品国产丝袜白色高跟鞋| www亚洲色图| 午夜欧美在线一二页| 成全电影大全在线观看| 91精品久久久久久久久久久久久| 欧美xxx网站| 欧美最新另类人妖| 国产福利一区二区三区视频在线| 在线观看av一区| 国产日本久久| 91久久精品www人人做人人爽| 欧洲黄色一级视频| 日韩在线欧美在线| 国产一级大片免费看| swag国产精品一区二区| 特黄毛片在线观看| 黄色a**址| 91传媒在线免费观看| 六月丁香久久丫| 亚洲欧美一区二区精品久久久| 国产美女一区视频| 激情视频网址| 亚洲成人第一区| 国产午夜精品全部视频在线播放| 国产成人麻豆精品午夜在线| 亚洲欧美一区二区久久| 无码人妻丰满熟妇啪啪网站| 欧美日韩一区久久| 日本视频免费一区| 欧美中文一区二区三区| 亚洲一二三区在线观看| 探花国产精品| 中文字幕xxxx| 在线观看av黄网站永久| 成人精品视频99在线观看免费| 色综合久久天天| 日本人妻伦在线中文字幕| 国产黑丝在线观看| 欧美中文字幕久久| 国产精品一线二线三线| 色一区二区三区| 这里只有精品视频在线观看| 日韩中文字幕有码| 色综合桃花网| 成人av资源电影网站| 天堂成人娱乐在线视频免费播放网站| 久久精品亚洲麻豆av一区二区| 亚洲国产成人综合| 国产91精品高潮白浆喷水| 91激情视频在线观看| 成人51免费| 视频一区视频二区中文字幕| 自拍偷拍欧美激情| 日本亲与子乱a| 天堂中文在线资| 欧美视频自拍偷拍| 亚洲美女又黄又爽在线观看| 日韩色在线观看| 欧美重口乱码一区二区| 日韩一级在线| 麻豆一区产品精品蜜桃的特点| 李宗瑞91在线正在播放| 日韩精品诱惑一区?区三区| 国产蜜臀av在线一区二区三区| 国产精品色视频| 一个人看的www在线免费观看| www.亚洲高清| 日韩激情在线视频| 灌醉mj刚成年的大学平面模特| 欧美主播一区二区三区美女| 永久免费看mv网站入口78| 欧美日韩成人在线视频| 成人av资源在线播放| 亚洲二区三区不卡| 夜夜嗨av一区二区三区四季av| 欧美一级手机免费观看片| 高清免费电影在线观看| 91在线一区| 欧美综合久久| 牛牛影视一区二区三区免费看| 亚洲第一色网| 色综合久久中文综合久久牛| 亚洲国产日韩综合久久精品| 狠狠v欧美ⅴ日韩v亚洲v大胸| 欧美三级xxx| 天堂精品中文字幕在线| 国偷自产视频一区二区久| 五月激激激综合网色播| 精品免费二区三区三区高中清不卡| 91视频88av| 久久久久久久网| 国产一区999| 国产精品视频网站在线观看| 蜜臀av色欲a片无码精品一区| 国产a久久麻豆| 影音先锋2020资源| 国产片侵犯亲女视频播放| 欧美人与动性xxxxx杂性| 国产精品自产拍在线观看| 两根大肉大捧一进一出好爽视频| 黄色片子免费看| 久久这里只有精品一区二区| 免费看日本黄色片| 欧美中文字幕在线观看视频| 99久久999| 五月天久久综合网| 欧美日韩在线视频一区二区三区| 欧美成人性色生活仑片| 久久99精品久久久久久国产越南| 成人免费xxxxx在线观看| 69av成年福利视频| 欧美午夜性生活| 性欧美video视频另类| 日韩在线高清| 成人免费网站在线| 97精品国产福利一区二区三区| 在线播放/欧美激情| 国产美女视频一区二区二三区| 欧美日韩精品综合在线| 欧美经典影片视频网站| 一个人看的www片免费高清视频| 妞干网2018| 久久99九九| 国产精品久久久久7777按摩| 亚洲国产一区二区三区青草影视| 精品福利视频导航| 国产精品视频一区二区三区| 国产成人无码www免费视频播放| 欧美午夜黄色| 国产一区二区三区日韩精品| 思思久久精品视频| 欧亚精品在线观看| 一本一本大道香蕉久在线精品| 美女性感视频久久久| crdy在线观看欧美| 国产91精品一区二区麻豆网站| 久久亚洲成人精品| 日韩高清在线播放| 美女精品久久| 免费人成福利播放| 在线观看日批视频| 性欧美videos另类hd| 欧美无砖专区免费| 日韩一级片中文字幕| 精品国产亚洲一区二区麻豆| 精品福利在线视频| 丁香亚洲综合激情啪啪综合| 黄色的视频在线观看| 欧美日韩亚洲一区二区三区| 欧美主播一区二区三区美女 久久精品人| 日韩久久电影| 精品久久美女| 国产麻豆乱码精品一区二区三区| 亚洲人成在线观| 在线三级av| 高清欧美性猛交xxxx黑人猛交| 日本一卡二卡在线播放| 国产91在线观看丝袜| 91高清视频在线观看| 国产精品黄页免费高清在线观看| 日韩 国产 欧美| 亚洲综合色婷婷| 国产成人午夜精品5599| 国产极品人妖在线观看| 成人综合电影| 天天干天天爱天天操| 国产成人午夜精品5599| 欧美激情黑白配| 高清av一区| 亚洲综合激情小说| 男人添女荫道口喷水视频| 中文字幕国内精品| 尤物视频在线看| 国产成人精品一区二| 中文字幕乱码人妻综合二区三区| 538精品在线视频| 国产精品久久久久久一区二区三区| 亚洲美女主播视频免费观看| 欧美日韩在线精品一区二区三区| 日本一区精品视频| 色婷婷av777| 先锋av资源站| 欧美日韩国产精品综合| 99久久夜色精品国产亚洲狼| 欧美性猛交xxxx免费看| 欧美男男大粗吊1069| 成人免费观看网站| 中文字幕久久亚洲| 视频一区国产精品| 精品成人国产在线观看男人呻吟| h版电影在线播放视频网址| 夜夜躁很很躁日日躁麻豆| 婷婷色在线观看| 国产精品久久久久av| 黄色av电影在线播放| 国产男女免费视频| 国产一区二区中文| 日韩一区二区在线看片| 日本1区2区3区视频| 大陆av在线播放| 日韩有码视频在线| 亚洲国产精品欧美一二99| gogo亚洲国模私拍人体| 精品一区二区三区的国产在线观看| 色999日韩国产欧美一区二区| 欧美日韩亚洲免费| 免费在线观看视频a| 伊人久久综合视频| 欧美精品亚洲二区| 一级黄色录像大片| 日本一区精品| 老牛嫩草一区二区三区日本| 蜜桃视频一区二区| 欧美性视频精品| 二区三区不卡不卡视频| 一区二区三区午夜视频| 草莓视频app18在线视频| 亚洲av成人精品一区二区三区在线播放| 自拍偷拍中文字幕| 久草在线资源站资源站| 日本美女一区二区三区| 在线观看日韩一区| 亚洲自拍第三页| 亚洲一卡二卡三卡四卡无卡久久| 激情小说综合网| 三级资源在线| 日韩一级大片| 91在线看国产| 国产女精品视频网站免费| 欧美人妻精品一区二区三区| 嗯用力啊快一点好舒服小柔久久| 久久女同性恋中文字幕| 日韩二区三区在线观看| 色综合久久九月婷婷色综合| 嘿咻视频在线看| 96精品久久久久中文字幕| 色婷婷精品大在线视频| 午夜亚洲性色视频| 欧美小视频在线观看| 国产精品成人一区二区三区| 精品国产一区二区三区忘忧草| 99热在线观看精品| 日本韩国欧美在线观看| 97超碰蝌蚪网人人做人人爽| 色视频在线观看免费| koreanbj精品视频一区| 亚洲欧美日本韩国| 免费极品av一视觉盛宴| 久99久精品视频免费观看| 亚洲一区精品视频| 欧美诱惑福利视频| 国产精品毛片一区二区三区| 国产一区福利视频| 国产精品一区二区三区99| 香蕉久久夜色| 91精品国产综合久久福利软件| 亚洲免费激情| 三区在线观看| 欧洲女同同性吃奶| 精品国产亚洲一区二区麻豆| 日韩毛片免费视频一级特黄| 色婷婷狠狠综合| a√免费观看在线网址www| 日韩欧美精品在线观看| 国产调教在线观看| 九色精品视频在线观看| 全色精品综合影院| 在线观看三级视频欧美| 福利片在线免费观看| 成人久久久久久久久| 精品视频久久久久久| 男女男精品网站| 国产精品视频一区二区三区不卡| 宇都宫紫苑在线播放| 婷婷色中文字幕| 国产精品1234区| 亚洲少妇激情视频| 日韩免费一区二区三区在线播放| 尤物国产精品| 免费一级在线观看| 伊人久久大香线蕉综合四虎小说| 国产精品三区在线观看| 国产97免费视| 精品久久久一区| 一个人免费观看在线视频www| 日韩免费观看高清完整版| 不卡免费追剧大全电视剧网站| 欧美激情va永久在线播放| xxxxxx在线观看| 国产精品午夜国产小视频| 成人网ww555视频免费看| 欧美色视频在线观看|