2015年8月8日 星期六

「swift」筆記5 - function

1.以下是一個function,傳入值為String (傳入名稱為message,

回傳值亦為String(->表示回傳值型態), func是關鍵字

func helloWorld(message : String) ->String
{
    return "\(message) Hello World"
}


//function call
var result1 = helloWorld("Eric")


回傳值為"Eric Hello World",\(變數名稱)  是用來做pattern String

2.以下是一個沒有回傳值的function


func printData(message:String)
{
    print(message)
}

printData("北七BLOG")


會印出北七BLOG,但不會回傳值。

3.多個參數的function


func helloWorl (message : String , who : String )  ->String
{
    return "\(who) say ... \(message)"
}

var result2 = helloWorl("你好", "bill")


輸出為 "bill say ... 你好"

4.多個回傳值的function


func comsitInformation(who : String , salary : Int , address : String ) ->(who  : String ,salary : Int ,address : String )
{
    var whoMsg = who + "你好"
    var curSalary = salary + 10000
    var result = (whoMsg,curSalary,address)
    
    return result
}

var result = comsitInformation("boy" , 100 , "高雄市前鎮區")

print(result.who)

輸出為"boy你好" ,它的會回傳是一個具名元組,可以用名稱取得內容。

EX: result.who、 result.salary、 result.address

5.function 亦支援overLoading

可以允許同名的function但參數型別、數量不同。


func helloWorld(message : String) ->String
{
    return "\(message) Hello World"
}
//overLoading
func helloWorld (message : String , who : String )  ->String
{
    return "\(who) say ... \(message)"
}

//function call
var result1 = helloWorld("Eric")

//call stong Typed function paramters
var result2 = helloWorld("你好", "bill")

6.變動參數長度,和JAVA的AsyncTask 輸入參數類似


func calc(values : Int...)->Int
{
   
    var myTOtal : Int = 0
    
    //走訪
    print("total:\(values.count)")
    for value in values
    {
        myTOtal += value
    }
    
    return myTOtal
}

var result3 = calc(10,20,55,55)

var result3 = calc(16,22)


7.function的參數預設的情況下是常數,不允許變更自身的值

//預設是常數,要改值要改成變數
func passingPocess(var #v1 : Int32 ,var  #v2 :Int32)
{
    v1 = v1 * 100
    v2 = v2 * 100
    
    print("new value: v1:\(v1) v2:\(v2)")
}

var lvar1 : Int32 = 100
var lvar2 : Int32 = 200

passingPocess(v1 : lvar1 , v2 :  lvar2)

如果你需要提供外部參數名,但是局部參數名已經定義好了,那麼你不需要寫兩次這些參數名。相反,只寫一次參數名,並用井字號(#)作為前綴就可以了。這告訴 Swift 使用這個參數名作為局部和外部參數名。

8.傳址參數

func passingPocess(inout #v1 : Int32 ,inout  #v2 :Int32)
{
    v1 = v1 * 100
    v2 = v2 * 100
}

passingPocess(v1 : &lvar1 , v2 :  &lvar2)
//call by referece inout
print("old value: lvar1:\(lvar1) lvar2:\(lvar2)")

9.定義函數型別(function當作一個Type)


func calc(values : Int...)->Int
{
   
    var myTOtal : Int = 0
    
    //走訪
    print("total:\(values.count)")
    for value in values
    {
        myTOtal += value
    }
    
    return myTOtal
}

var calProxy :(Int...) -> Int = calc

var returntotal = calProxy(1,2,3,4,5)

calProxy即為我們定義的函數型別

亦可寫的更加精簡

//不寫參數也可以
var calProxy2 = calc
var returntotal2 = calProxy2(1,2,3,4,5)

10.函式當成參數傳遞


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

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

func printMathResult(mathFunction: (Int, Int) -> Int, a: Int, b: Int) {
    println("Result: \(mathFunction(a, b))")
}
printMathResult(addTwoInts, 3, 5)
// prints "Result: 8」

參考來源:

http://tommy60703.gitbooks.io/swift-language-traditional-chinese/content/chapter2/06_Functions.html

沒有留言:

張貼留言