小弟的規劃表 - http://blog.kerkerj.in/blog/2014/11/01/planning/
好讀版 - http://blog.kerkerj.in/blog/2014/10/06/swift-d6/
來看看 Swift 各種 function 的寫法吧!
Swift 使用 func 當作宣告的保留字
GOLANG 的 fu.... XD
寫 Swift 的 function 會很開心
func say() {
println("Hello!")
}
func say() -> String {
return "Hello!"
}
func say() -> (String, Int) {
let greeting = "hello"
let times = 5
return (greeting, times)
}
say()
func say(g: String) {
println(g)
}
say("Hello")
多個參數
func say(g: String, times: Int) {
for index in 1...times {
println(g)
}
}
say("Hello", 3)
func say(greetings g: String) {
println(g)
}
say("Hello", 3)
此時如果同樣使用 say("hello") 會出錯
因為我們剛剛宣告了外部參數名稱
因此需要:
say(greetings: "hello")
這種寫法在必須代入許多參數時,非常好用,會讓程式可讀性變高
另外,方便起見,也可以加上 #,表示外部參數名稱與 func 內部名稱是一樣的
func say(greetings g: String, #times: Int) {
for index in 1...times {
println(g)
}
}
say(greetings: "Hello", times: 3)
可以看到第一種寫法和第二種寫法是一樣的功用~
func say(greetings g: String = "hello") {
println(g)
}
say()
如果呼叫 say() 而沒有給定參數時,會直接使用預設值
簡單看一下以下的程式碼
func say(greetings: String = "hello") {
greetings = "\(greetings), welcome!"
println(greetings)
}
let greetings = "Hello!"
say(greetings: greetings)
我們定義了一個常數,代入 say() 裡面,
但是 say function 裡面必須改變代入的值,於是這個時候 Xcode 就會該了
那要怎麼辦呢?
修改成:
func say(var greetings: String = "hello") {
greetings = "\(greetings), welcome!"
println(greetings)
}
let greetings = "Hello!"
say(greetings: greetings)
多加一個 var 宣告,就會 copy 一份傳入,就可以更改值了!
一樣是非常有用的語法!
直接看例子
func swapInt(inout a: Int, inout b: Int) {
let tmpA = a
a = b
b = tmpA
}
var a = 1
var b = 2
swap(&a, &b)
println(a)
println(b)
酷吧
直接看例子
func addTwoInt(a: Int, b: Int) -> Int {
return a + b
}
func mTwoInt(a: Int, b: Int) -> Int {
return a * b
}
func printHello() {
println("Hello World")
}
var mathFunction: (Int, Int) -> Int = addTwoInt
println("result: \(mathFunction(2, 3))")
前面宣告了三個 function ,
而
var mathFunction: (Int, Int) -> Int = addTwoInt
後面的這句的意思是:
我們定義了一個變數叫做 mathFunction,
他的型別是「一個 (Int, Int) 的參數,並且回傳 Int」的 function,
簡單說就是 mathFunction 的型別是一個 Function
並指向 addTwoInt 這個 function
所以上面的例子中,mathFunction 代入的 (2, 3) 會丟給 addTwoInt,
並且最後回傳 Int
有 javascript 的味道:
var test = function(a, b) {
return a + b;
};
var add = test;
console.log("result = " + add(2, 3));
函式也可以拿來當做參數傳入函式中,
接續上面的例子,加入:
func printResult(mathFunction: (Int, Int) -> Int, a: Int, b: Int ) {
println("Result: \(mathFunction(a, b))")
}
printResult(mathFunction, 2, 3)
函式也可以拿來當做回傳值
就是在原本的回傳符號 -> 後面代入函式型別
這邊直接借別人的例子來參考吧
// 定義兩個 function
func stepForward(input: Int) -> Int {
return input + 1
}
func stepBackward(input: Int) -> Int {
return input - 1
}
// 再定義一個 function ,透過布林值導往上面不同的 function
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
return backwards ? stepBackward : stepForward
}
var currentValue = 3
// 將 chooseStepFunction 指給 moveNearerToZero
// 所以 moveNearerToZero 現在是一個 function 了!
let moveNearerToZero = chooseStepFunction(currentValue > 0)
println("Counting to zero:")
// Counting to zero:
while currentValue != 0 {
println("\(currentValue)... ")
currentValue = moveNearerToZero(currentValue)
}
println("zero!")
就是 funciton 中的 function,變數有分 global、local 變數,function 也有
以上面的例子來改寫:
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
}