Swift 3 的函數格式如下:
函數如果沒有返回型別,可以省略或回傳 Void。函數如果不需參數傳入,括號內也可省略不寫。而有函數參數時,在每個參數名稱前的標籤 (例如 param1Label 和 param2Label ) 是可省略不寫的,此時標籤就會等於參數名稱。呼叫函數時,須要帶入標籤,格式如下:func funcName(param1Label param1Name: Type, param2Label param2Name: Type) -> returnType {//使用 param1Nmae 和 param2Name 進行運算return returnTypeValue}
funcName(param1Label: param1Value, param2Label: param2Value)
舉例說明如下:如果呼叫函數時,不想要帶入標籤,可以在函數宣告時用"_"來取代 paramLabel。當函數有返回值時,如果此返回值沒有被使用的話,編譯器會有 warning 產生,此時可以用 "let _ = someFunc()" 來忽略函數返回值。func greet(who person: String) -> String {return "Hello, " + person + "!"}//呼叫函數時,需要帶入標籤 whoprint(greet(who: "AppCoolBao"))//沒有標籤時,標籤就等於參數名稱 personfunc greet2(person: String) -> String {return "Hello, " + person + "!"}//呼叫函數時,需要帶入標籤 personprint(greet2(person: "AppCoolBao"))
在函數宣告時給予參數預設值,這樣在呼叫函數時,可以不帶入標籤和參數值,此時會自動以預設值帶入函數中。有參數預設值的函數也可以選擇帶入其他非預設值的參數值。func greet(_ person: String) -> String {print("Welcome!")return "Hello, " + person + "!"}//呼叫函數時,不需要帶入標籤print(greet("AppCoolBao"))//如果不需要使用函數返回值時,可用 let _ = someFunc() 來忽略let _ = greet("AppCoolBao")
函數裡參數的個數並沒有限制,如果你不確定要輸入幾個參數,可以在參數型別後使用 "..." 來表示參數個數是任意的,但是這些參數須要相同型別,且在函數裡只能使用一次。此時,參數會以 Array 的方式傳入函數中運算。func greet(person: String = "Sir") -> String {return "Hello, " + person + "!"}//呼叫函數時,可以不需要帶入標籤和參數值print(greet())//也可帶入標籤和其他非預設值的參數值print(greet(person: "AppCoolBao"))
Swift 傳進函數裡的參數都是常數,無法被改變其值,不像 C 語言可以傳指標參數去更改參數的值。Swift 裡並沒有指標 (Pointer) 的型別與操作,如果要改變參數的值,需要在參數型別前加上 inout 關鍵字,代表此參數可在函數中更改其值,且更改後的值在函數結束後也會同步更新到此參數中。呼叫函數時,inout 型式的變數參數前面要加上 "&" 表示其值可被更改。另外要注意的是,inout 型式的參數在函數宣告時不能給予預設值,也不能用 "..." 來宣告成任意參數個數。func greet(person: String...) {for name in person {print("Hello, \(name)!")}}//帶入標籤和任意的參數值greet(person: "AppCoolBao", "Swift", "iOS")
每一個函數都有代表的型別,由參數型別和返回型別組成。例如函數 func greet(who person: String) -> String,其型別為 (String) -> String。所以函數型別也可以用來宣告常數或變數。宣告成函數型別的常數或變數被給予值後,使用時不用帶入標籤,直接輸入符合型別的參數即可。func greet(person: inout String) {person = "Sir"print("Hello, \(person)!")}var customerName = ""//帶入標籤和 inout 變數參數greet(person: &customerName)// customerName 的值被更改成 "Sir"print(customerName)
同樣的,函數型別也可以用在函數的參數宣告裡,可以當作參數型別,也可以當作返回型別。甚至函數裡面還可以再宣告函數(稱之為內嵌函數),其內嵌的函數也可以當作返回值來返回,這使得函數的應用變化可以有各式各樣的可能,是 Swift 相當強大的一點。func greet(who person: String) -> String {return "Hello, " + person + "!"}func greet2(eat food: String) -> String {return "Do you want to eat " + food + "?"}//宣告 welcomeMsg 變數,並給予 greet 的值,此時其型別會自動判定為 (String)->Stringvar welcomeMsg = greet//不用帶入標籤,直接輸入符合型別的參數即可print(welcomeMsg("AppCoolBao"))//改成給予 greet2 的值welcomeMsg = greet2print(welcomeMsg("cake"))
沒有留言:
張貼留言