2.2、函式
//: Playground - noun: a place where people can play
import UIKit
//函式:用來完成特定任務的程式碼塊
/*
函式宣告: 告訴編譯器函式的名字,返回型別及引數
函式定義: 提供了函式的實體
func(關鍵字) 函式名稱 (引數名:引數型別,引數名:引數型別..)->函式返回值型別{函式實現部分}
*/
//無參返回值
funcsay(){
print("hello")
}
say()
//有引數無返回值
funcsayWithName(name:String,age:Int){
print("say is\(name)")
}
sayWithName(name:"Tom",age:18)
//有引數有返回值型別
funcinfoShow(name:String,age:Int)->String{
return ("My name is\(name)")
}
letb =infoShow(name:"Tina", age:10)
print(b)
//巢狀函式
funcshowArray(array:[Int]){
fornuminarray {
print(num)
}
leta = array.count
ifa>0{
print("陣列有值")
}
// func add(a:Int,b:Int)->Int{
// return a + b
// }
// return add(a: 7, b: 8)
}
showArray(array: [2,3,4,5])
//預設情況下的引數都是內部引數,不能外部使用,外部引數只能外部使用,函式內部不能使用
//函式引數
funcjoinStr(s1:String,s2:String,value s3:String="name")->String{
returns1+s2+s3
}
joinStr(s1:"1", s2:"2")
joinStr(s1:"1", s2:"2", value:"3")
//注意:如果引數有預設值,需要修改需加上外部引數名
//預設情況下,swift中所有引數都是常量引數,如需要修改需修改變數在函式內重新賦值
funcswapValue(a:Int,b:Int){
vara = a
varb = b
print("交換前a =\(a) b =\(b)")
lettemp = a
a = b
b = temp
print("交換後a =\(a) b =\(b)")
}
swapValue(a:3,b:4)
//如果想在函式中修改外界傳入的引數,可以在引數的資料型別新增關鍵字inout,這時候傳遞的是引數本身而不是引數的值
varx1 =10
varx2 =20
funcswap3(ax:inoutInt,bx:inoutInt){
lettemp = ax
ax = bx
bx = temp
print("交換後a =\(x1) b =\(x2)")
}
print("交換前a =\(x1) b =\(x2)")
swap3(ax: &x1, bx: &x2)
/*
inout 關鍵字補充 swift有兩種引數傳遞方式
1、值傳遞
值傳遞是引數的一個副本,這樣在呼叫引數的過程中不會影響原始資料
2、指標傳遞
指標傳遞把引數本身引用(記憶體地址)傳遞過去,在呼叫的過程會影響原始資料
說明上面inout是什麼傳遞? 指標傳遞
在swift中,只有class是指標傳遞,其餘的比如Int、Float、Bool等都是值傳遞
有時候我們需要通過一個函式改變函式外面變數的值(將一個值型別引數以引用方式傳遞),這時,Swift提供的inout關鍵字就可以實現
注意 inout修飾的引數是不能有預設值的,
一個引數一旦被inout修飾,就不能再用var 或者 let修飾
*/
varvalue =50
funcincrement(value:inoutInt, length:Int) {
value += length
}
increment(value: &value, length: 20)//系統預設新增了一個&地址符號,說明可以修改原地址資料
print(value)
//如果有多個引數可以使用集合
funcadd(other:Int,nums:Int...)->Int{
varsum =0
fornuminnums{
sum += num
}
returnsum
}
add(other:2, nums:1,2,3,4)
//函式實際上是一種特殊的閉包,你可以使用{}來建立一個匿名閉包。使用in將引數和返回值型別宣告與閉包函式體進行分離。
varnumbers = [1,3,4,2,5]
numbers.map({
(number:Int)->Intin
letresult =3* number
returnresult
})
//你可以通過引數位置而不是引數名字來引用引數——這個方法在非常短的閉包中非常有用。當一個閉包作為最後一個引數傳給一個函式的時候,它可以直接跟在括號後面。
print("特殊閉包==",numbers.map({ numberin3* number }))
//map怎麼使用
letmapnumbers = [1,2,3,4]
letresult =mapnumbers.map{ $0 +2}
print(result) // [3,4,5,6]
//map 方法接受一個閉包作為引數, 然後它會遍歷整個 numbers 陣列,並對陣列中每一個元素執行閉包中定義的操作。 相當於對陣列中的所有元素做了一個對映。 比如我們們這個例子裡面的閉包是講所有元素都加 2 。 這樣它產生的結果資料就是 [3,4,5,6]
/*
------------------------------函式型別:
類似於C語言的指向函式的指標
類似於OC語言的block
函式型別是由函式的引數型別和返回值型別組成的
*/
//可以利用函式型別定義函式變數和常量
funcsum(a:Int,b:Int)->Int{
returna + b
}
funcsub(a:Int,b:Int,c:Int)->Int{
returna - b
}
// 這兩個函式的型別是 (Int, Int) -> Int
// 函式型別可以作為函式返回值
funcmax(a:Int, b:Int) ->Int
{
returna > b ? a : b
}
funcsub(a:Int, b:Int) ->Int
{
returna - b;
}
// 可以利用函式型別定義函式變數和常量
varfuncP:(Int,Int) ->Int=sum
funcP = sub
print(funcP(10,20))
//練習 page130
//1、2 4 //2、為什麼下面程式碼不編譯 4沒有逗號//3、3
//如果statuscode是個有5個元素的元祖,什麼方式去獲取到第五個值 1
相關文章
- 2.2 畫出函式圖形函式
- MySQL函式大全(字串函式,數學函式,日期函式,系統級函式,聚合函式)MySql函式字串
- Oracle 函式大全(字串函式,數學函式,日期函式,邏輯運算函式,其他函式)Oracle函式字串
- 【函式式 Swift】函式式思想函式Swift
- python中id()函式、zip()函式、map()函式、lamda函式Python函式
- 【函式】Oracle函式系列(2)--數學函式及日期函式函式Oracle
- Python 擴充之特殊函式(lambda 函式,map 函式,filter 函式,reduce 函式)Python函式Filter
- 第7章 IF函式 COUNTIF函式 SUMIF函式函式
- 字元函式、數字函式和日期函式字元函式
- 【函式】Oracle EXTRACT()函式與to_char() 函式函式Oracle
- MySQL(四)日期函式 NULL函式 字串函式MySql函式Null字串
- 【函式】ORACLE函式大全函式Oracle
- (譯) 函式式 JS #2: 函式!函式JS
- 核函式 多項式核函式 高斯核函式(常用)函式
- 函式名/函式地址/函式指標函式指標
- 第 8 節:函式-匿名函式、遞迴函式函式遞迴
- lambda匿名函式sorted排序函式filter過濾函式map對映函式函式排序Filter
- js函式 函式自呼叫 返回函式的函式 (閉包)JS函式
- main函式的入口函式AI函式
- (函式)實現strstr函式函式
- 字串函式之Strtok()函式字串函式
- SQL函式之日期函式SQL函式
- Oracle聚合函式/分析函式Oracle函式
- fork函式與vfork函式函式
- 常用函式--時間函式函式
- ORACLE單行函式與多行函式之七:多行函式之分組函式示例Oracle函式
- 函式式JavaScript(4):函式柯里化函式JavaScript
- 箭頭函式、簡寫函式、普通函式的區別函式
- Oracle OCP(03):字元函式、數字函式和日期函式Oracle字元函式
- webgl內建函式--幾何函式與矩陣函式Web函式矩陣
- webgl內建函式--向量函式與紋理查詢函式Web函式
- Hive函式(內建函式+自定義標準函式UDF)Hive函式
- 深入理解 函式、匿名函式、自執行匿名函式函式
- Mysql 常用函式(15)- upper 函式MySql函式
- webgl內建函式--指數函式Web函式
- webgl內建函式--通用函式Web函式
- 類函式和物件函式 PHP函式物件PHP
- 聚合函式與數字函式函式