標籤:numbers turn put ret 比較 apt swa 方式 max
函數
函數是一個獨立的代碼塊,用來執行特定的任務。Swift中的函數與Object-C中的函數一樣,但是聲明與書寫的方式不太一樣,現在我們就通過幾個例子介紹一下Swift中的函數。簡單的來說,他與JS中的函式宣告有些相像,但是如果有傳回值的時候,他們傳回值的書寫方式又有不同。
先來說一個簡單的例子
//greet 函數的名稱//personName:函數的形式參數,可以為多個 用逗號隔開//->String 函數的傳回值類型 如果沒有可以不寫func greet(personName:String) ->String { let greeting = "hello:" + personName + "!" print(greeting) return greeting;}//函數的調用greet(personName: "tian")函數的形式參數和傳回值
在Swift中,函數的形式參數和傳回值非常靈活,你可以定義從一個簡單的只有一個未命名形式參數的工具函數到那種具有形象的參數名稱和不同的形式參數選項的複雜函數之間的任何函數。
無形式參數的函數
函數沒有要求必須輸入一個參數,或者函數內部不需要接受外部的變數就可以完成特定的功能,例子
//無形式參數的函數func sayHelloWorld()->String { return "Hello World"}print(sayHelloWorld());
函數的定義仍然需要在名字後邊加一個圓括弧,即使它不接受形式參數也得這樣做。當函數被調用的時候也要在函數的名字後邊加一個空的圓括弧。
多形式參數的函數
func greet(personName:String) ->String { let greeting = "hello:" + personName + "!" print(greeting) return greeting;}//函數的調用greet(personName: "tian")//多形式參數的函數/* 函數可以輸入多個形式參數 可以卸載寒暑後面的圓括弧內 用逗號分隔 */func greetAgain(person:String) -> String { return "Hello one more time"}func secondGreet(person:String,alreadGreeted:Bool) -> String { if alreadGreeted { return greetAgain(person:person); }else { return greet(personName: person) }}//調用函數secondGreet(person: "tian", alreadGreeted: false)無傳回值的函數
//無傳回值的函數/* 函數定義中沒有要求必須有一個傳回型別 下面是另一個版本的greet函數 */func thirdGreet(person:String) { print("Hello,\(person)")}thirdGreet(person: "tian")
因為沒有反悔值,函數在定義的時候就不用寫(->)或者傳回型別
//我們在調用函數的時候 也可以忽略函數的傳回值func printAndCount(string:String) ->Int { print(string) return string.characters.count}func printWithoutCounting(string:String) { let _ = printAndCount(string: "tianfeng")}printAndCount(string: "liantian");printWithoutCounting(string: "swift")
注意:傳回值可以被忽略 但是如果一個函數需要傳回值的時候就必須返回,如果一個函數有定義傳回型別,沒有反回值的話就不會運行到函數的末尾,會報編譯時間的錯誤
多傳回值的函數
為了讓函數返回多個值作為一個複合的傳回值,你可以使用元群組類型作為傳回型別。
func minMax(array:[Int]) ->(min:Int, max:Int) {// var currentMin = array[0]// var currentMax = array[0]// // for value in array {// if value < currentMin {// currentMin = value;// }else if (value > currentMax) {// currentMax = value// }// }// return (currentMin,currentMax); return (array.min()!,array.max()!)}let minAndMax = minMax(array: [1,2,3,4,5])print("\(minAndMax.min) and \(minAndMax.max)")
可選元組傳回型別
如果元組在函數的傳回型別中可能沒有值,你可以用一個可選元組傳回型別來說明整個元組可能是nil。下面就是一個例子:
func minMax(array:[Int]) -> (min:Int,max:Int)? { if array.isEmpty { return nil } return (array.min()!,array.max()!)}//由於是可選類型 所以在調用的時候 返回的可能為nil 我們就需要對傳回值進行解包處理if let bounds = minMax(array: [8,-6,102,3,71]) { print("\(bounds.min) and \(bounds.max)")}函數的實際參數標籤和形式參數名
每一個函數的形式參數都包含實際參數標籤和形式參數名。實際參數標籤用在調用函數的時候,在調用函數的時候每一個實際參數前面都要寫實際參數標籤,形式參數名用在函數的實現中。預設情況下,形式參數適用它們的形式參數作為實際參數標籤。
func someFunction(firstParameterName:Int?,secondParameterName:Int?) { guard let x = firstParameterName, let y = secondParameterName else { return } print((x + y));}someFunction(firstParameterName: 7, secondParameterName: 2)
左右的形式參數必須有唯一的名字。儘管有可能多個形式參數擁有相同的實際參數標籤,唯一的實際參數標籤有助於讓你的代碼更加易讀。
指定實際參數標籤
在提供的形式參數名之前寫實際參數標籤 用空格分開
func someFunction(實際參數 parameterName:Int) { print("傳進來的參數是:\(parameterName)")}someFunction(實際參數: 67)省略實際參數標籤
//省略實際參數標籤func someFunction1(_ firstParameterName: Int, secondParameterName: Int) { }someFunction1(1, secondParameterName: 3)
預設形式參數值
你可以通過在行駛參數類型後給形式參數賦值來給函數的任意形式參數定義一個預設值,如果定義了預設值,您就可以在調用函數的時候省略這個形式參數
func haveValueFunction(a:Int = 12,b:Int) ->Int { return b * a}print(haveValueFunction(b: 15))//雖然有了預設值,但是如果你想改變 還是可以改變的print(haveValueFunction(a: 10, b: 5))
可變形式參數
一個可變形式參數可以接受零或者多個特定類型的值。當調用函數的時候你可以利用可變形式參數來聲明形式參數可以被傳入值的數量是可變的。可以通過在形式參數的類型名稱後邊插入三個點符號( ...)來書寫可變形式參數。
傳入到可變參數中的值在函數的主體中被當作是對應類型的數組。舉個栗子,一個可變參數的名字是 numbers類型是 Double...在函數的主體中它會被當作名字是 numbers 類型是 [Double]的常量數組。
func arithmeticMean(numbers:Double...) ->Double { var total:Double = 0; for number in numbers { total += number } return total / Double(numbers.count)}arithmeticMean(numbers: 1,2,3,4,5,6)輸入輸出形式參數
可變的形式參數職能在函數的內部做出改變,如果你想函數能夠修改一個形式參數的值,而且你想這些改變在函數結束之後依然有效,那麼就需要將形式參數定義為輸入輸出形式參數。
在形式參數定義開始的時候天際一個inout關鍵字可以定義一個輸入輸出的形式參數。輸入輸出的形式參數有一個能輸入給函數的值,函數能對其進行改變。還能輸出到函數外邊替換原來的值。
//輸入輸出形式參數func swapTwoInts(_ a: inout Int, _ b: inout Int) { let temp = a a = b b = temp}var c = 10 ,b = 11swap(&c, &b);c//11b//10函數類型
每一個函數都有一個特定的函數類型 它由形式參數類型 傳回型別組成。
func addTwoInts(a:Int,b:Int) -> Int{ return a + b;}func multiplyTwoInts(_ a: Int, _ b: Int) -> Int { return a * b}
上邊的栗子定義了兩個簡單的數學函數 addTwoInts和 multiplyTwoInts 。這兩個函數每個傳入兩個 Int值,返回一個 Int值,就是函數經過數學運算得出的結果。
這兩個函數的類型都是 (Int, Int) -> Int 。也讀作:
“有兩個形式參數的函數類型,它們都是 Int類型,並且返回一個 Int類型的值。”
func printHelloWorld() { print("hello, world")}
這個函數的類型是 () -> Void,或者 “一個沒有形式參數的函數,返回 Void。”
使用函數類型
你可以像使用 Swift 中的其他類型一樣使用函數類型。例如,你可以給一個常量或變數定義一個函數類型,並且為變數指定一個相應的函數。
var mathFunction:(Int,Int)->Int = addTwoInts
“定義一個叫做 mathFunction的變數,它的類型是‘一個能接受兩個 Int值的函數,並返回一個 Int值。’將這個新的變數指向 addTwoInts函數。”
這個 addTwoInts(_:_:)函數和 mathFunction函數有相同的類型,所以這個賦值是可以通過 Swift 的類型檢查的。
mathFunction(3,4)
函數類型作為傳回型別
func stepForward(input:Int)->Int{ return input - 1}func stepBackWard(input:Int) ->Int { return input + 1}func choseStepFunction(backwards:Bool) -> (Int)->Int { return backwards ? stepForward : stepBackWard}var currentValue = 3let moveNearerToZero = choseStepFunction(backwards: currentValue > 0)while currentValue != 0 { currentValue = moveNearerToZero(currentValue)}內嵌函數
上面所說的所有的函數都是全域函數都是在全域的範圍內進行定義的。你也可以在函數的內部定義另一個函數,這就是內嵌函數。
內嵌函數預設情況下在外部是被隱藏起來的,但卻仍然可以通過包裹它們的函數來調用它們。包裹的函數也可以返回他內部的一個內嵌函數來在另外的範圍裡使用。
func chooseStepFunction(backward:Bool) ->(Int)->(Int) { func stepForward(input:Int)->Int{ return input + 1 } func stepBackWard(input:Int) ->Int { return input - 1 } return backward ? stepBackWard : stepForward}var currentValue = -4let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)while currentValue != 0 { currentValue = moveNearerToZero(currentValue)}
以上就是swift中關於函數的部分了,比較基礎,以後遇見複雜的會在回來更新。
Swift 學習筆記 (函數)