元組(Tuples)
元組數據類型是由多個值組合而成的,可以由相同類型的多個值組成,也可以由不同類型的值組成
// 元祖類型
var dog = ("小白",18)
// 下標調用
dog.0
利用下標可以取得元祖數據類型的值
as(告知編譯器類型)
// 告知編譯器 這個由dog.0所取出的數據是一個string類型,理解為類型準換也是可以的
(dog.0 as String)
-objective-c與swift函數的區別
** objective-c 的函數 :**
// 傳入一張UIImage類型的參數,和一個UIControlState的枚舉
- (void)setImage:(UIImage *)image forState:(UIControlState)state;
上面是一個標準的objective-c對象方法,是通過對象調用的其中:
"-" = 對象方法的標示 "+"為類方法.
(void) = 返回值類型.
setImage: = 方法名 : 后面代表著要跟一個參數.
(UIImage *) = 參數類型.
image = 形參的變量名稱.
forState: = 方法名 第二段方法名.
(UIControlState) = 參數類型.
state = 第二個參數變量名.
因為objective-c語言方法的語法,可以在方法名種盡可能的描述詳細整個方法意思和參數的作用,所以在有些時候,方法的注釋很多程序員寫得都不是很完全.
** swift 的函數: **
- 無參數無返回值的函數:
// 一個無參數,無返回值的函數 調用
demo();
// 一個無參數,無返回值的函數聲明
func demo(){
println("調用");
}
在swift中,函數的定義符號是func
后面的demo就是方法的名稱,如果沒有參數和返回值,定義函數只書寫 func
+ 函數名稱(方法名稱)+() + { 代碼段 } 就可以了,調用只需要 方法名+().
// 一個參數,無返回值的函數 調用
demo("jack");
// 一個參數,無返回值的函數 聲明(定義)
func demo(name : NSString){
println("我叫\(name)");
}
打印出 "我叫jack"
// 兩個參數,無返回值的函數 調用
demo("jack", age: "18");
// 兩個個參數,無返回值的函數 聲明(定義)
func demo(name : NSString,age : NSString ){
println("我叫\(name)今年\(age)歲");
}
打印出 "我叫jack今年18歲"
以上的方法中可以看出在swift中可以允許相同的方法名對應不同的參數,而值得注意的是,第二個參數的形參名稱是不允許重復的,即擁有相同方法名,并且都是2個形參,第二個形參的變量名稱不允許相同.
形參的格式 : 形參名稱: 數據類型 (形參中間用,隔開)
// 調用單個返回值的函數
var name:NSString = demo1()
// 單個返回值的函數
func demo1() ->(NSString){
return "swift"
}
單個返回值的函數格式:func
函數名( 形參 ) ->(返回值類型)
// 調用函數,得到一個元祖類型的返回值
let te = demo1("我")
// 將元祖類型的返回值一一取出拼接
let text = (te.0 as String) + (te.1 as String) + (te.2 as String);
// 打印
print(text);
// 打印結果為: 我測出了BUG
// 單參數 多返回值的函數
func demo1(name:NSString)->(NSString,NSString,NSString){
return (name,"測出了","BUG");
}
swift新加入了多個返回值的函數,這個樣的函數返回的是一個元祖類型
格式: func
函數名(形參列表) ->(返回值,...)
數組當做形參的2種形式:
1種:
// 調用函數傳入數組
arrDemo([3,6]);
// 直接傳入一個數組變量
func arrDemo(arr:NSArray){
// 遍歷數組元素
for indext in arr{
// 打印得到3,6
print(indext);
}
}
2種:
// 調用函數
arr1Demo(11.3,222.341,11112.3);
// 傳入參數用,隔開
func arr1Demo(num:CGFloat...){
// 遍歷數組元素 并打印
for indext in num{
print(indext);
}
}
1種格式: 形參變量:NSArray
2種格式: 形參變量: 數據類型...
閉包:
override func viewDidLoad() {
super.viewDidLoad()
func nog(){
print("打印日志")
}
nog()
}
閉包簡單就是說在一個函數中能夠定義一個函數,在外部函數中可以調用里面的函數,并且里面的函數可以訪問外部函數的變量.
// 首先定義一個接收一個int參數 一個string返回值的函數,這是一個內部函數
func test(num:Int) -> (String) {
return "\(num)號測試";
}
// 在定義一個外部函數,這個函數接收一個函數變量, 這個函數擁有一個int的形參和 string的返回值
func demo( test: Int -> (String) )->NSString{
// 在外部函數中調用當做形參的內部函數
return test(2);
}
// 將這個外部番薯調用, 并用一個字符串接收返回值
let testStr = demo(test)
// 打印 得到結果是: 2號測試
print(testStr);
函數作為形參 ( 函數變量名 : 形參列表 -> (返回值類型) )
// 定義一個外部函數 這個函數的返回值是一個閉包函數,傳入一個string形參,返回值是string的函數
func demo3()->(String -> String){
// 內部函數,形參string ,返回值string
func text(name:String)->String{
return name;
}
// 返回的是閉包函數
return text;
}
// 調用閉包函數,得到 一個函數 形參是string 返回值是string
let text = demo3();
// 調用這個函數
let n :String = text("小白");
// 打印最后得到的值 輸出是小白
print(n)
函數作為返回值 ->(形參->返回值)
匿名閉包函數
// 首先先寫一個匿名閉包函數,這個函數接收3個字符串參數并且拼接后返回
// 但是我們沒有方法名所以訪問不了這個函數
{(name:String,name2:String,name3:String) -> String in
return name + name2 + name3
}
// 在寫一個接收的函數,這個函數可以接收上面的那種匿名函數的類型,并且返回一個字符串
func demo4(test:(String,name2:String,name3:String)->String )->String{
}
// 在這個函數中調用匿名函數,所返回的是中國人3個字,
func demo4(test:(String,name2:String,name3:String)->String )->String{
return test("中",name2: "國",name3: "人");
}
// 那么我們要執行 demo4這個函數 并且將匿名函數傳進去,所得到的返回值是"中國人"
let name = self.demo4({(name:String,name2:String,name3:String) -> String in
return name + name2 + name3
})
// 打印
print(name)