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

首頁 > 編程 > Swift > 正文

Swift教程之函數(shù)詳解

2020-03-09 17:51:20
字體:
供稿:網(wǎng)友
這篇文章主要介紹了Swift教程之函數(shù)詳解,本文講解了函數(shù)的聲明與調(diào)用、函數(shù)的參數(shù)和返回值、函數(shù)參數(shù)名、函數(shù)類型等內(nèi)容,需要的朋友可以參考下
 

函數(shù)是執(zhí)行特定任務(wù)的代碼自包含塊。給定一個函數(shù)名稱標(biāo)識, 當(dāng)執(zhí)行其任務(wù)時就可以用這個標(biāo)識來進(jìn)行”調(diào)用”。

Swift的統(tǒng)一的功能語法足夠靈活來表達(dá)任何東西,無論是甚至沒有參數(shù)名稱的簡單的C風(fēng)格的函數(shù)表達(dá)式,還是需要為每個本地參數(shù)和外部參數(shù)設(shè)置復(fù)雜名稱的Objective-C語言風(fēng)格的函數(shù)。參數(shù)提供默認(rèn)值,以簡化函數(shù)調(diào)用,并通過設(shè)置在輸入輸出參數(shù),在函數(shù)執(zhí)行完成時修改傳遞的變量。

Swift中的每個函數(shù)都有一個類型,包括函數(shù)的參數(shù)類型和返回類型。您可以方便的使用此類型像任何其他類型一樣,這使得它很容易將函數(shù)作為參數(shù)傳遞給其他函數(shù),甚至從函數(shù)中返回函數(shù)類型。函數(shù)也可以寫在其他函數(shù)中來封裝一個嵌套函數(shù)用以范圍內(nèi)有用的功能。

1、函數(shù)的聲明與調(diào)用

當(dāng)你定義一個函數(shù)時,你可以為其定義一個或多個不同名稱、類型值作為函數(shù)的輸入(稱為參數(shù)),當(dāng)該函數(shù)完成時將傳回輸出定義的類型(稱為作為它的返回類型)。

每一個函數(shù)都有一個函數(shù)名,用來描述了函數(shù)執(zhí)行的任務(wù)。要使用一個函數(shù)的功能時,你通過使用它的名稱進(jìn)行“調(diào)用”,并通過它的輸入值(稱為參數(shù))來匹配函數(shù)的參數(shù)類型。一個函數(shù)的提供的參數(shù)必須始終以相同的順序來作為函數(shù)參數(shù)列表。

例如在下面的例子中被調(diào)用的函數(shù)greetingForPerson,像它描述的那樣 — 它需要一個人的名字作為輸入并返回一句問候給那個人。

 

復(fù)制代碼代碼如下:
 
func sayHello(personName: String) -> String {
let greeting = "Hello, " + personName + "!"
return greeting
}

所有這些信息都匯總到函數(shù)的定義中,并以func關(guān)鍵字為前綴。您指定的函數(shù)的返回類型是以箭頭->(一個連字符后跟一個右尖括號)以及隨后類型的名稱作為返回的。

 

該定義描述了函數(shù)的作用是什么,它期望接收什么,以及當(dāng)它完成返回的結(jié)果是什么。該定義很容易讓該函數(shù)可以讓你在代碼的其他地方以清晰、明確的方式來調(diào)用:

 

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

println(sayHello("Anna"))
// prints "Hello, Anna!"
println(sayHello("Brian"))
// prints "Hello, Brian!"

通過括號內(nèi)String類型參數(shù)值調(diào)用sayHello的函數(shù),如的sayHello(”Anna”)。由于該函數(shù)返回一個字符串值,sayHello的可以被包裹在一個println函數(shù)調(diào)用中來打印字符串,看看它的返回值,如上圖所示。

 

在sayHello的函數(shù)體開始定義了一個新的名為greeting的String常量,并將其設(shè)置加上personName個人姓名組成一句簡單的問候消息。然后這個問候函數(shù)以關(guān)鍵字return來傳回。只要問候函數(shù)被調(diào)用時,函數(shù)執(zhí)行完畢是就會返回問候語的當(dāng)前值。

你可以通過不同的輸入值多次調(diào)用sayHello的函數(shù)。上面的例子顯示了如果它以”Anna”為輸入值,以”Brian”為輸入值會發(fā)生什么。函數(shù)的返回在每種情況下都是量身定制的問候。

為了簡化這個函數(shù)的主體,結(jié)合消息創(chuàng)建和return語句用一行來表示:

 

復(fù)制代碼代碼如下:
 
func sayHello(personName: String) -> String {
return "Hello again, " + personName + "!"
}
println(sayHello("Anna"))
// prints "Hello again, Anna!"

2、函數(shù)的參數(shù)和返回值

 

在swift中函數(shù)的參數(shù)和返回值是非常具有靈活性的。你可以定義任何東西無論是一個簡單的僅僅有一個未命名的參數(shù)的函數(shù)還是那種具有豐富的參數(shù)名稱和不同的參數(shù)選項(xiàng)的復(fù)雜函數(shù)。

多輸入?yún)?shù)

函數(shù)可以有多個輸入?yún)?shù),把他們寫到函數(shù)的括號內(nèi),并用逗號加以分隔。下面這個函數(shù)設(shè)置了一個開始和結(jié)束索引的一個半開區(qū)間,用來計算在范圍內(nèi)有多少元素包含:

 

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

func halfOpenRangeLength(start: Int, end: Int) -> Int {
return end - start
}
println(halfOpenRangeLength(1, 10))
// prints "9"

無參函數(shù)

 

函數(shù)并沒有要求一定要定義的輸入?yún)?shù)。下面就一個沒有輸入?yún)?shù)的函數(shù),任何時候調(diào)用時它總是返回相同的字符串消息:

 

復(fù)制代碼代碼如下:
 
func sayHelloWorld() -> String {
return "hello, world"
}
println(sayHelloWorld())
// prints "hello, world"

該函數(shù)的定義在函數(shù)的名稱后還需要括號,即使它不帶任何參數(shù)。當(dāng)函數(shù)被調(diào)用時函數(shù)名稱也要跟著一對空括號。

 

沒有返回值的函數(shù)

函數(shù)也不需要定義一個返回類型。這里有一個版本的sayHello的函數(shù),稱為waveGoodbye,它會輸出自己的字符串值而不是函數(shù)返回:

 

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

func sayGoodbye(personName: String) {
println("Goodbye, /(personName)!")
}
sayGoodbye("Dave")
// prints "Goodbye, Dave!"

因?yàn)樗⒉恍枰祷匾粋€值,該函數(shù)的定義不包括返回箭頭( – >)和返回類型。

 

提示
嚴(yán)格地說,sayGoodbye功能確實(shí)還返回一個值,即使沒有返回值定義。函數(shù)沒有定義返回類型但返
回了一個void返回類型的特殊值。它是一個簡直是空的元組,實(shí)際上零個元素的元組,可以寫為()。
當(dāng)一個函數(shù)調(diào)用時它的返回值可以忽略不計:

 

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

func printAndCount(stringToPrint: String) -> Int {
println(stringToPrint)
return countElements(stringToPrint)
}
func printWithoutCounting(stringToPrint: String) {
printAndCount(stringToPrint)
}
printAndCount("hello, world")
// prints "hello, world" and returns a value of 12
printWithoutCounting("hello, world")
// prints "hello, world" but does not return a value

第一個函數(shù)printAndCount,打印了一個字符串,然后并以Int類型返回它的字符數(shù)。第二個函數(shù)printWithoutCounting,調(diào)用的第一個函數(shù),但忽略它的返回值。當(dāng)?shù)诙瘮?shù)被調(diào)用時,字符串消息由第一函數(shù)打印了回來,去沒有使用其返回值。

 

提示

返回值可以忽略不計,但對一個函數(shù)來說,它的返回值即便不使用還是一定會返回的。在函數(shù)體底部
返回時與定義的返回類型的函數(shù)不能相容時,如果試圖這樣做將導(dǎo)致一個編譯時錯誤。

多返回值函數(shù)

你可以使用一個元組類型作為函數(shù)的返回類型返回一個有多個值組成的一個復(fù)合作為返回值。

下面的例子定義了一個名為count函數(shù),用它計來算字符串中基于標(biāo)準(zhǔn)的美式英語中設(shè)定使用的元音、輔音以及字符的數(shù)量:

 

復(fù)制代碼代碼如下:
 
func count(string: String) -> (vowels: Int, consonants: Int, others: Int) {
var vowels = 0, consonants = 0, others = 0
for character in string {
switch String(character).lowercaseString {
case "a", "e", "i", "o", "u":
++vowels
case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
"n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
++consonants
default:
++others
}
}
return (vowels, consonants, others)
}

您可以使用此計數(shù)函數(shù)來對任意字符串進(jìn)行字符計數(shù),并檢索統(tǒng)計總數(shù)的元組三個指定Int值:

 

 

復(fù)制代碼代碼如下:
 
let total = count("some arbitrary string!")
println("/(total.vowels) vowels and /(total.consonants) consonants")
// prints "6 vowels and 13 consonants"

需要注意的是在這一點(diǎn)上元組的成員不需要被命名在該該函數(shù)返回的元組中,因?yàn)樗麄兊拿忠呀?jīng)被指定為函數(shù)的返回類型的一部分。

 

3、函數(shù)參數(shù)名

所有上面的函數(shù)都為參數(shù)定義了參數(shù)名稱:

 

復(fù)制代碼代碼如下:
 
func someFunction(parameterName: Int) {
// function body goes here, and can use parameterName
// to refer to the argument value for that parameter
}

然而,這些參數(shù)名的僅能在函數(shù)本身的主體內(nèi)使用,在調(diào)用函數(shù)時,不能使用。這些類型的參數(shù)名稱被稱為本地的參數(shù),因?yàn)樗鼈冎贿m用于函數(shù)體中使用。

 

外部參數(shù)名

有時當(dāng)你調(diào)用一個函數(shù)將每個參數(shù)進(jìn)行命名是非常有用的,以表明你傳遞給函數(shù)的每個參數(shù)的目的。

如果你希望用戶函數(shù)調(diào)用你的函數(shù)時提供參數(shù)名稱,除了設(shè)置本地地的參數(shù)名稱,也要為每個參數(shù)定義外部參數(shù)名稱。你寫一個外部參數(shù)名稱在它所支持的本地參數(shù)名稱之前,之間用一個空格來分隔:

 

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

func someFunction(externalParameterName localParameterName: Int) {
// function body goes here, and can use localParameterName
// to refer to the argument value for that parameter
}

 

注意

如果您為參數(shù)提供一個外部參數(shù)名稱,調(diào)用該函數(shù)時外部名稱必須始終被使用。
作為一個例子,考慮下面的函數(shù),它通過插入他們之間的第三個”joiner”字符串來連接兩個字符串:

 

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

func join(s1: String, s2: String, joiner: String) -> String {
return s1 + joiner + s2
}

當(dāng)你調(diào)用這個函數(shù),你傳遞給函數(shù)的三個字符串的目的就不是很清楚了:

 

 

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

join("hello", "world", ", ")
// returns "hello, world"

為了使這些字符串值的目的更為清晰,為每個join函數(shù)參數(shù)定義外部參數(shù)名稱:

 

 

復(fù)制代碼代碼如下:
 
func join(string s1: String, toString s2: String, withJoiner joiner: String)
-> String {
return s1 + joiner + s2
}

在這個版本的join函數(shù)中,第一個參數(shù)有一個外部名稱string和一個本地名稱s1;第二個參數(shù)有一個外部名稱toString和一個本地名稱s2;第三個參數(shù)有一個外部名稱withJoiner和一個本地名稱joiner。

 

現(xiàn)在,您可以使用這些外部參數(shù)名稱調(diào)用清楚明確的調(diào)用該函數(shù):

 

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

join(string: "hello", toString: "world", withJoiner: ", ")
// returns "hello, world"

使用外部參數(shù)名稱使join函數(shù)的第二個版本功能更富有表現(xiàn)力,用戶習(xí)慣使用sentence-like的方式,同時還提供了一個可讀的、意圖明確的函數(shù)體。

 

注意

考慮到使用外部參數(shù)名稱的初衷就是為了在別人第一次閱讀你的代碼時并不知道你函數(shù)參數(shù)的目的是什么。
但當(dāng)函數(shù)調(diào)用時如果每個參數(shù)的目的是明確的和毫不含糊的,你并不需要指定外部參數(shù)名稱。

外部參數(shù)名稱速記

如果你想為一個函數(shù)參數(shù)提供一個外部參數(shù)名,然而本地參數(shù)名已經(jīng)使用了一個合適的名稱了,你不需要為該參數(shù)寫相同的兩次名稱。取而代之的是,寫一次名字,并用一個hash符號(#)作為名稱的前綴。這告訴Swift使用該名稱同時作為本地參數(shù)名稱和外部參數(shù)名稱。

這個例子定義了一個名為containsCharacter的函數(shù),定義了兩個參數(shù)的外部參數(shù)名稱并通過放置一個散列標(biāo)志在他們本地參數(shù)名稱之前:

 

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

func containsCharacter(#string: String, #characterToFind: Character) -> Bool {
for character in string {
if character == characterToFind {
return true
}
}
return false
}

這個函數(shù)選擇的參數(shù)名稱清晰的、函數(shù)體極具可讀性,使的該函數(shù)被調(diào)用時沒有歧義:

 

 

復(fù)制代碼代碼如下:
 
let containsAVee = containsCharacter(string: "aardvark", characterToFind: "v")
// containsAVee equals true, because "aardvark" contains a "v"

 

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

可以為任何參數(shù)設(shè)定默認(rèn)值來作為函數(shù)的定義的一部分。如果默認(rèn)值已經(jīng)定義,調(diào)用函數(shù)時就可以省略該參數(shù)的傳值。

注意

將使用默認(rèn)值的參數(shù)放在函數(shù)的參數(shù)列表的末尾。這確保了所有調(diào)用函數(shù)的非默認(rèn)參數(shù)使用相同的順
序,并明確地表示在每種情況下相同的函數(shù)調(diào)用。
這里有一個版本,是早期的join函數(shù),并為參數(shù)joiner設(shè)置了默認(rèn)值:

 

復(fù)制代碼代碼如下:
 
func join(string s1: String, toString s2: String,
withJoiner joiner: String = " ") -> String {
return s1 + joiner + s2
}

如果在join函數(shù)被調(diào)用時提供給joiner一個字符串值,該字符串是用來連接兩個字符串,就跟以前一樣:

 

 

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

join(string: "hello", toString: "world", withJoiner: "-")
// returns "hello-world"

 

但是,如果當(dāng)函數(shù)被調(diào)用時提供了joiner的沒有值,就會使用單個空格(” “)的默認(rèn)值:

 

復(fù)制代碼代碼如下:
 
join(string: "hello", toString: "world")
// returns "hello world"

 

有默認(rèn)值的外部名稱參數(shù)

在大多數(shù)情況下,為所有參數(shù)提供一個外部帶有默認(rèn)值的參數(shù)的名稱是非常有用的(因此要求)。這將確如果當(dāng)函數(shù)被調(diào)用時提供的值時參數(shù)必須具有明確的目的。

為了使這個過程更容易,當(dāng)你自己沒有提供外部名稱時,Swift自動為所有參數(shù)定義了缺省的參數(shù)外部名稱。自動外部名稱與本地名稱相同,就好像你在你的代碼中的本地名稱之前寫了一個hash符號。

這里有一個早期join函數(shù)版本,它不為任何參數(shù)提供的外部名稱,但仍然提供了joiner參數(shù)的默認(rèn)值:

 

復(fù)制代碼代碼如下:
 
func join(s1: String, s2: String, joiner: String = " ") -> String {
return s1 + joiner + s2
}

在這種情況下,Swift自動為一個具有默認(rèn)值的參數(shù)提供了外部參數(shù)名稱。調(diào)用函數(shù)時,為使得參數(shù)的目的明確、毫不含糊,因此必須提供外部名稱:

 

 

復(fù)制代碼代碼如下:
 
join("hello", "world", joiner: "-")
// returns "hello-world"

 

注意

你可以通過編寫一個下劃線(_)有選擇進(jìn)行這種行為,而不是一個明確的定義外部參數(shù)名稱。然
而,在適當(dāng)情況下有默認(rèn)值的外部名稱參數(shù)總是優(yōu)先被使用。

可變參數(shù)

一個可變參數(shù)的參數(shù)接受零個或多個指定類型的值。當(dāng)函數(shù)被調(diào)用時,您可以使用一個可變參數(shù)的參數(shù)來指定該參數(shù)可以傳遞不同數(shù)量的輸入值。寫可變參數(shù)的參數(shù)時,需要參數(shù)的類型名稱后加上點(diǎn)字符(…)。

傳遞一個可變參數(shù)的參數(shù)的值時,函數(shù)體中是以提供適當(dāng)類型的數(shù)組的形式存在。例如,一個可變參數(shù)的名稱為numbers和類型為Double…在函數(shù)體內(nèi)就作為名為numbers類型為Double[]的常量數(shù)組。

下面的示例計算任意長度的數(shù)字的算術(shù)平均值(也稱為平均):

 

復(fù)制代碼代碼如下:
 
func arithmeticMean(numbers: Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total / Double(numbers.count)
}
arithmeticMean(1, 2, 3, 4, 5)
// returns 3.0, which is the arithmetic mean of these five numbers
arithmeticMean(3, 8, 19)
// returns 10.0, which is the arithmetic mean of these three numbers

 

注意

函數(shù)可以最多有一個可變參數(shù)的參數(shù),而且它必須出現(xiàn)在參數(shù)列表的最后以避免多參數(shù)函
數(shù)調(diào)用時出現(xiàn)歧義。

如果函數(shù)有一個或多個參數(shù)使用默認(rèn)值,并且還具有可變參數(shù),將可變參數(shù)放在列表的
最末尾的所有默認(rèn)值的參數(shù)之后。

常量參數(shù)和變量參數(shù)

函數(shù)參數(shù)的默認(rèn)值都是常量。試圖改變一個函數(shù)參數(shù)的值會讓這個函數(shù)體內(nèi)部產(chǎn)生一個編譯時錯誤。這意味著您不能錯誤地改變參數(shù)的值。

但是,有時函數(shù)有一個參數(shù)的值的變量副本是非常有用的。您可以通過指定一個或多個參數(shù)作為變量參數(shù),而不是避免在函數(shù)內(nèi)部為自己定義一個新的變量。變量參數(shù)可以是變量而不是常量,并給函數(shù)中新修改的參數(shù)的值的提供一個副本。

在參數(shù)名稱前用關(guān)鍵字var定義變量參數(shù):

 

復(fù)制代碼代碼如下:
 
func alignRight(var string: String, count: Int, pad: Character) -> String {
let amountToPad = count - countElements(string)
for _ in 1...amountToPad {
string = pad + string
}
return string
}
let originalString = "hello"
let paddedString = alignRight(originalString, 10, "-")
// paddedString is equal to "-----hello"
// originalString is still equal to "hello"

 

這個例子定義了一個新函數(shù)叫做alignRight,它對準(zhǔn)一個輸入字符串,以一個較長的輸出字符串。在左側(cè)的空間中填充規(guī)定的字符。在該示例中,字符串”hello”被轉(zhuǎn)換為字符串”—–hello”。

該alignRight函數(shù)把輸入?yún)?shù)的字符串定義成了一個變量參數(shù)。這意味著字符串現(xiàn)在可以作為一個局部變量,用傳入的字符串值初始化,并且可以在函數(shù)體中進(jìn)行相應(yīng)操作。

函數(shù)首先找出有多少字符需要被添加到左邊讓字符串以右對齊在整個字符串中。這個值存儲在本地常量amountToPad中。該函數(shù)然后將填充字符的amountToPad個字符拷貝到現(xiàn)有的字符串的左邊,并返回結(jié)果。整個過程使用字符串變量參數(shù)進(jìn)行字符串操作。

注意

一個變量參數(shù)的變化沒有超出了每個調(diào)用函數(shù),所以對外部函數(shù)體是不可見的。變量參數(shù)只能存在于函數(shù)調(diào)用
的生命周期里。

輸入-輸出參數(shù)

可變參數(shù),如上所述,只能在函數(shù)本身內(nèi)改變。如果你想有一個函數(shù)來修改參數(shù)的值,并且想讓這些變化要堅(jiān)持在函數(shù)調(diào)用結(jié)束后,你就可以定義輸入-輸出參數(shù)來代替。

通過在其參數(shù)定義的開始添加inout關(guān)鍵字寫用來標(biāo)明輸入-輸出參數(shù)。一個在輸入-輸出參數(shù)都有一個傳遞給函數(shù)的值,由函數(shù)修改后,并從函數(shù)返回來替換原來的值。

4、函數(shù)類型

每個函數(shù)都有一個特定的類型,包括參數(shù)類型和返回值類型,比如:

 

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

func addTwoInts(a: Int, b: Int) -> Int {
    return a + b
}
func multiplyTwoInts(a: Int, b: Int) -> Int {
    return a * b
}

 

這個例子定義了兩個簡單的數(shù)學(xué)函數(shù)addTwoInts和multiplyTwoInts。每個函數(shù)接受兩個int參數(shù),返回一個int值,執(zhí)行相應(yīng)的數(shù)學(xué)運(yùn)算然后返回結(jié)果

這兩個函數(shù)的類型是(Int, Int)->Int可以解釋為:

這個函數(shù)類型它有兩個int型的參數(shù),并返回一個int類型的值

下面這個例子是一個不帶任何參數(shù)和返回值的函數(shù):

 

復(fù)制代碼代碼如下:
 
func printHelloWorld() {
    println("hello, world")
}

這個函數(shù)的類型是()->(),或者函數(shù)沒有參數(shù),返回void。函數(shù)沒有顯式地指定返回類型,默認(rèn)為void,在Swift中相當(dāng)于一個空元組,記為()。

 

使用函數(shù)類型

在swift中你可以像任何其他類型一樣的使用函數(shù)類型。例如,你可以定義一個常量或變量為一個函數(shù)類型,并指定適當(dāng)?shù)暮瘮?shù)給該變量:

 

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

var mathFunction: (Int, Int) -> Int = addTwoInts

可以解讀為:

 

“定義一個名為mathFunction變量,該變量的類型為'一個函數(shù),它接受兩個int值,并返回一個int值。'設(shè)置這個新的變量來引用名為addTwoInts函數(shù)的功能。”

該mathFunction函數(shù)具有與addTwoInts函數(shù)相同類型的變量,所以這個賦值能通過Swift的類型檢查。

現(xiàn)在你可以調(diào)用指定的函數(shù)名稱為mathFunction:

 

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

println("Result: /(mathFunction(2, 3))")
// prints "Result: 5"

不同的函數(shù)相同的匹配類型可以分配給相同的變量,也同樣的適用于非函數(shù)性類型:

 

 

復(fù)制代碼代碼如下:
 
mathFunction = multiplyTwoInts
println("Result: /(mathFunction(2, 3))")
// prints "Result: 6"

與其他類型一樣,你可以把它迅速定義成函數(shù)類型當(dāng)你為常量或變量分配一個函數(shù)時:

 

 

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

let anotherMathFunction = addTwoInts
// anotherMathFunction is inferred to be of type (Int, Int) -> Int

 

函數(shù)類型的參數(shù)

可以使用一個函數(shù)類型,如(Int, Int)->Int作為另一個函數(shù)的參數(shù)類型。這使你預(yù)留了一個函數(shù)的某些方面的實(shí)現(xiàn),讓調(diào)用者調(diào)用函數(shù)時提供。

下面就以打印上面的數(shù)學(xué)函數(shù)的結(jié)果為例:

 

復(fù)制代碼代碼如下:
 
func printMathResult(mathFunction: (Int, Int) -> Int, a: Int, b: Int) {
    println("Result: /(mathFunction(a, b))")
}
printMathResult(addTwoInts, 3, 5)
// prints "Result: 8"

這個例子中定義了一個名為printMathResult函數(shù),它有三個參數(shù)。第一個參數(shù)名為mathFunction,類型為(Int, Int)->Int。您可以傳入符合條件的任何函數(shù)類型作為此函數(shù)的第一個參數(shù)。第二和第三個參數(shù)a、b都是int類型。被用作于提供數(shù)學(xué)函數(shù)的兩個輸入值。

 

當(dāng)printMathResult被調(diào)用時,它傳遞addTwoInt函數(shù),以及整數(shù)值3和5。它使用3和5,調(diào)用addTwoInt函數(shù),并打印函數(shù)運(yùn)行的結(jié)果8。

printMathResult的作用是調(diào)用一個適當(dāng)類型的數(shù)學(xué)函數(shù)并打印相應(yīng)結(jié)果。那是什么功能的實(shí)現(xiàn)其實(shí)并不重要,你只要給以正確的類型匹配就行。這使printMathResult以調(diào)用者類型安全的方式轉(zhuǎn)換了函數(shù)的功能。

函數(shù)類型的返回值

可以使用一個函數(shù)類型作為另一個函數(shù)的返回類型。返回的函數(shù)(->)即你的返回箭頭后,立即寫一個完整的函數(shù)類型就做到這一點(diǎn)。
下面的例子定義了兩個簡單的函數(shù),分別是stepForward和stepBackward。stepForward函數(shù)返回輸入值自增1,而stepBackward函數(shù)返回輸入值自減1。這兩個函數(shù)都有一個相同的類型 (Int) -> Int:

 

復(fù)制代碼代碼如下:
 
func stepForward(input: Int) -> Int {
    return input + 1
}
func stepBackward(input: Int) -> Int {
    return input - 1
}

這里有一個chooseStepFunction函數(shù),它的返回類型是”函數(shù)類型(Int) -> Int”。chooseStepFunction返回一個基于布爾參數(shù)的stepBackward或stepForward函數(shù)類型:

 

 

復(fù)制代碼代碼如下:
 
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
    return backwards ? stepBackward : stepForward
}

您現(xiàn)在可以使用chooseStepFunction選擇一個函數(shù),可能是加一函數(shù)或另一個:

 

 

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

var currentValue = 3
let moveNearerToZero = chooseStepFunction(currentValue > 0)
// moveNearerToZero now refers to the stepBackward() function

上述例子可以判斷步驟的正負(fù)決定是否需要移動使得currentValue變量逐步接近零。currentValue初始值是3,這意味著當(dāng)前值>0,則返回true,chooseStepFunction返回stepBackward函數(shù)。返回函數(shù)的引用存儲在一個稱為moveNearerToZero常量里。
如今moveNearerToZero執(zhí)行了正確的功能,就可以用來計數(shù)到零:

 

 

復(fù)制代碼代碼如下:
 
println("Counting to zero:")
// Counting to zero:
while currentValue != 0 {
println("/(currentValue)... ")
currentValue = moveNearerToZero(currentValue)
}
println("zero!")
// 3...
// 2...
// 1...
// zero!

5、嵌套函數(shù)

 

迄今為止所有你在本章中遇到函數(shù)都是全局函數(shù),在全局范圍內(nèi)定義。其實(shí)你還可以在其他函數(shù)中定義函數(shù),被稱為嵌套函數(shù)。

嵌套函數(shù)默認(rèn)對外界是隱藏的,但仍然可以調(diào)用和使用其內(nèi)部的函數(shù)。內(nèi)部函數(shù)也可以返回一個嵌套函數(shù),允許在嵌套函數(shù)內(nèi)的另一個范圍內(nèi)使用。

你可以重寫上面的chooseStepFunction例子使用并返回嵌套函數(shù):

 

復(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!


注:相關(guān)教程知識閱讀請移步到swift教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
欧美人与动性xxxxx杂性| 亚洲亚洲人成综合网络| 午夜视频网站在线观看| 韩国女主播一区二区| 在线黄色.com| 男人扒开美女尿口无遮挡图片| 亚洲欧美日韩视频一区| 亚洲日本视频在线| 亚洲久草视频| 成人中文视频| 日韩va在线观看| 国语精品一区| xxx一区二区| 麻豆tv免费在线观看| 日日摸夜夜添夜夜添亚洲女人| 国产丝袜精品视频| h视频免费观看| 美女精品视频一区| 日韩欧美在线番号| 国产午夜免费视频| 欧美夫妻性生活| 午夜在线不卡| 国产精品igao视频网网址不卡日韩| 亚洲另类中文字| 丰满熟女一区二区三区| 性欧美精品xxxx| 国产精品污网站| 精品国产亚洲一区二区三区大结局| www.黄色网| 日本妇乱大交xxxxx| 成人做爰高清视频网站| 思99热精品久久只有精品| 免费的黄色片| 伊人伊人伊人久久| 57pao国产精品一区| 99久久久久久久久久| 国产精品人妖ts系列视频| 最新黄色av网址| 国产精品专区一| 热久久最新地址| 99精品电影| 久久手机免费视频| 成人区精品一区二区| 亚洲桃色在线一区| 欧美大码xxxx| 亚洲aⅴ天堂av在线电影软件| 国内精品久久久久久久影视蜜臀| 农村少妇一区二区三区四区五区| 亚洲欧美日韩成人在线| 黄色片网址在线观看| 天堂av最新在线| www.av88| 激情欧美丁香| 日韩深夜福利网站| 国产高潮在线观看| 337p亚洲精品色噜噜狠狠| 国模视频一区二区| 日本欧洲一区| 亚洲黄页网站| 性欧美亚洲xxxx乳在线观看| 国产三级三级在线观看| 亚洲精品99久久久久中文字幕| 一区二区三区福利| 国产精品av一区二区三区| 亚洲精品国产精品久久清纯直播| 嫩草影院发布页| 日本韩国福利视频| 精品人妻午夜一区二区三区四区| 国产精品77777竹菊影视小说| 国产在线观看一区| 免费欧美日韩国产三级电影| 成人亚洲视频| 天堂在线中文字幕| 国产精品国产亚洲精品| 日本一区二区在线| 黑人极品videos精品欧美裸| 国产无码精品久久久| 艳女tv在线观看国产一区| 国产在线观看精品一区二区三区| 日韩av免费在线看| 欧美日韩国产在线观看网站| 激情综合在线观看| 欧美做受xxxxxⅹ性视频| 日本电影一区二区三区| 欧美香蕉爽爽人人爽| 成人国产亚洲精品a区天堂华泰| 中文字幕在线免费播放| 亚洲天堂av老司机| 一区二区激情小说| 久久精品视频免费播放| 一本一本久久a久久精品综合妖精| 亚洲国产成人91porn| 亚洲成人激情综合网| 亚洲丝袜制服诱惑| 青青青草视频| 日韩av电影在线网| 国产香蕉成人综合精品视频| 成人看片人aa| 18成人免费观看视频| 国产欧美精品一区二区三区四区| 亚洲涩涩在线| 色女孩综合网| 五月天婷婷视频| 午夜久久久久久久| xxxxx国产| 欧美精品日韩综合在线| 桃乃木香奈和黑人aⅴ在线播放| 欧美日韩第二页| av大片免费观看| 亚欧无线一线二线三线区别| 欧美xxxx做受欧美.88| 成人性生交视频免费观看| 亚洲国产av一区二区| 久久久久久91精品色婷婷| 国产成人精品av在线观| 澳门成人av网| 999久久久精品视频| 日本不卡一二三区黄网| 成人av网站在线播放| 中文字幕一区二区三区乱码在线| a级免费在线观看| 中文字幕一区二区人妻电影丶| 亚洲高清视频在线| 翔田千里精品久久一区二| 日本高清不卡视频| 一级全黄肉体裸体全过程| 色综合久久九月婷婷色综合| 久久久久电影| 777电影在线观看| 天堂资源在线| 中文字幕高清不卡| 五月天色一区| 麻豆精品少妇| 九一在线视频| 免费福利在线| 久久精品系列| 日本按摩中出| 一级特黄aaa大片在线观看| 国产一级一片免费播放| 天天色天天操天天做| 97人妻精品视频一区| 亚洲一区二区中文字幕| jizz日本免费| 嫩草视频在线免费观看| 激情乱色小说视频| 国产美女情趣调教h一区二区| 国产色片在线观看| 中文字幕免费国产精品| 欧美6一10sex性hd| 欧美性片在线观看| 一二三区在线播放| 女人偷人在线视频| 91国产精品成人| 三级黄在线观看| 国产日韩欧美在线播放不卡| 福利一区视频在线观看| 一本色道久久综合狠狠躁的推荐| 精品无码久久久久久久久| 欧美精美视频| 免费黄网站观看| 亚洲国产欧美在线成人app| 欧美日韩福利| 久久精品日韩精品| 91中文字幕在线| 国产一区二区精品在线观看| 国产美女精品在线| 男人捅女人免费视频| 日本www在线播放| 欧美国产日韩a欧美在线观看| 亚洲视频在线观看免费视频| 羞羞小视频视频| 久久这里有精品| 欧美一级特黄高清视频| 五月天久久久久久| 综合网插菊花| 日夜干在线视频| 日韩中文字幕网站| 欧美黄色网视频| 99免费在线视频观看| 97av中文字幕| 午夜影院免费播放| japanese国产精品| 在线看黄网址| 超碰成人久久| 性欧美18一19性猛交| 又黄又骚的视频| 最新国产中文字幕| 欧美xxxooo| 亚洲精品欧美极品| 深夜福利视频网站| 中国av一区| 超碰在线免费播放| 小视频免费在线观看| 精品国产导航| 国产成人精品亚洲精品色欲| av在线国产精品| 欧美99久久| 欧美精品密入口播放| 欧美麻豆久久久久久中文| 午夜国产福利视频| 91精品国产高清久久久久久91| www.色偷偷.com| 欧美黄色aaa| 亚洲精品久久久久久无码色欲四季| 黄色aaa级片| 亚洲精品美女在线| 欧美日韩在线观看不卡| 亚洲精品成人电影| 91一区一区三区| 久久午夜a级毛片| 国产麻豆乱码精品一区二区三区| 日本在线视频www| 老司机成人在线| 久久久女女女女999久久| 亚洲国产精品精华液网站| 国产一区二区色| 欧美一区 二区 三区| 少妇高潮一区二区三区喷水| 国产一区二区不卡老阿姨| 精品国产老师黑色丝袜高跟鞋| 成人区一区二区| 欧美日韩一级在线观看| 成人永久免费| 亚洲电影在线一区二区三区| 国产精品对白刺激| 日韩少妇与小伙激情| 97超碰免费在线| 黄页网站大全一区二区| 你懂的视频在线看| 91女人18毛片水多国产| 深夜爽爽视频| 亚洲精品国产拍免费91在线| 国产精品稀缺呦系列在线| 中文字幕一区免费在线观看| av国产精品| 日本亚洲欧美在线| 欧美videosex性极品hd| 西西人体一区二区| 青草全福视在线| 亚洲黄色三级| 亚洲少妇自拍| 精品视频一区在线视频| 亚洲欧美综合国产精品一区| 亚洲经典一区二区| 九九热在线免费| 亚洲成人天堂网| 菠萝蜜视频在线观看一区| 亚洲av成人精品毛片| 成人拍拍拍免费视频网站| 日韩激情电影| 国产chinese男男gaygay网站| 老司机成人免费视频| 中文字幕乱码久久午夜不卡| 97超级在线观看免费高清完整版电视剧| 91亚洲国产成人精品一区二区三| 国产精品第七十二页| 一卡二卡在线视频| 成人一区二区三区四区| 久久国产免费视频| 欧美裸体xxxx极品少妇| 日日摸夜夜添夜夜添亚洲女人| 国产欧美一区二区视频| 国产精品乱人伦一区二区| 日韩中文字幕视频| 麻豆精品永久免费视频| 成人av一区| 先锋影音男人资源| 中文字幕日韩有码| 免费a视频在线观看| 久久久久久999| 一区视频网站| 一本色道久久88综合日韩精品| 91高跟黑色丝袜呻吟在线观看| 97视频免费在线观看| 国产人妻一区二区| 欧美午夜一区二区福利视频| 国模精品一区| 蜜桃a∨噜噜一区二区三区| 岛国视频午夜一区免费在线观看| 91在线视频一区| 一级片黄色录像| 亚洲欧洲国产日韩精品| 性欧美精品孕妇| 国产精品一页| 成人av.网址在线网站| 日韩av一二三四区| 99久久久久久久| 丰满爆乳一区二区三区| 中文字幕一区二区久久人妻网站| 香蕉视频网页版| 亚洲精品视频在线看| 天堂网视频在线观看| 免费精品视频一区| 天干夜夜爽爽日日日日| 高清电影一区| 岛国片免费看| 国产在线视频2019最新视频| 在线观看日韩一区二区| 涩涩视频免费观看| 久久精品黄色片| 不卡一区在线观看| 成人做爰视频www网站小优视频| 国产又黄又大久久| 一区二区三区毛片免费| 男人的天堂久久| 国产一区激情| 亚洲va久久久噜噜噜无码久久| 久久亚洲AV无码专区成人国产| 青青草久久爱| 暖暖在线中文免费日本| 国产伦精品一区二区免费| ass白嫩白嫩的小美女| 亚洲精品国产精品国| 国产一区二区动漫| av在线免费观看网址| 欧洲国产精品| 日韩中文字幕第一页| 亚洲成av人片在线| 日韩在线综合| 一本色道a无线码一区v| 久久精品一级片| 中文字幕亚洲综合久久菠萝蜜| 91成人在线看| 另类亚洲自拍| 一区二区三区免费看| 国产伦精品一区二区三区视频黑人| 欧美一级淫片a免费视频| 国产精品偷伦视频免费观看了|