swift學(xué)習(xí)代碼筆記
swift 最基本的學(xué)習(xí)結(jié)束了,但是很多細(xì)節(jié)問(wèn)題都沒(méi)有搞的太明白,看以后的使用情況吧,在應(yīng)用中再深入理解。明天就可以用swift開(kāi)發(fā)項(xiàng)目了,高興!
//:?Playground?-?noun:?a?place?where?people?can?play import?UIKit /*---------------------1.Swift的基本數(shù)據(jù)類型-----------------------------*/ var?study?=?0 if?study?<?100 { ????//1.1?Swift?關(guān)鍵字和標(biāo)示符 ????//這樣會(huì)報(bào)錯(cuò) ????//var?class?=?2; ????var?`class`?=?2?//可以這樣定義于標(biāo)示符沖突的變量,但是不建議 ????/* ????關(guān)鍵字分四類:聲明相關(guān)的(private)語(yǔ)句相關(guān)的(break)類型表達(dá)式相關(guān)的(self)。特定上下文相關(guān)的(left,lazy)。 ????*/ ????//變量的聲明必須確定類型,可以自己顯示的指定,也可以初始化讓系統(tǒng)推斷類型,下面都可以。 ????var?b:Int ????var?a?=?10 ????var?c?:Int?=?100 ????//也可以一次聲明多個(gè)變量,類型也不需要相同 ????var?d=20,e:Int,f="hello?" ????//常量聲明用的是let,其他部分聲明方面和變量一樣 ????let?constA?=?10 ????//constA?=2?不能重新賦值 ????//數(shù)據(jù)輸出 ????print(constA) ????print("a的值是:(a),f的值是:(f)")//用(變量的)形式插入到字符串輸出 ????//整形 ????///?默認(rèn)的Int長(zhǎng)度等于所在平臺(tái)的原生字長(zhǎng),細(xì)分了Int8,16,32和Uint8,Uint16,32等等 ????//var?uchar?:UInt8?=?256?//范圍是0-255?超出范圍?報(bào)錯(cuò)了 ????var?unchar?:UInt8?=?0128?//前面加0也可以 ????var?binaryInt?=?0b1001_0100?//可以用二進(jìn)制表示,支持下劃線分開(kāi) ????var?hexInt?=?0xAf ????var?octalInt?=?0o777?//這是八進(jìn)制 ????//浮點(diǎn)數(shù)類型?1.十進(jìn)制,2.科學(xué)技術(shù)法??5.2e3?=?5200?3.16進(jìn)制數(shù)表示?0x5.a2p4,?以0x開(kāi)頭,p代表4 ????//的p次方?=?0x5.a2?*?2^4 ????//浮點(diǎn)數(shù)提供了正無(wú)窮大,負(fù)無(wú)窮大和非數(shù)?三個(gè)?特殊的浮點(diǎn)數(shù)。 ????//正的浮點(diǎn)數(shù)?除以0.0得到正無(wú)窮,負(fù)的浮點(diǎn)數(shù)除以0.0得到負(fù)無(wú)窮,0.0除以0.0的非數(shù) ????var?float_a?=?5.0,float_b?=?-5.0 ????print("正無(wú)窮和正無(wú)窮相等(float_a/0.0==(4.0/0.0)),負(fù)無(wú)窮和負(fù)無(wú)窮相等(float_b/0.0==(-4.0/0.0)),非數(shù)和非數(shù)自己都不相等(0.0/0.0==(0.0/0.0))") ????//非浮點(diǎn)數(shù)除以0.0會(huì)報(bào)錯(cuò)的 ????//var?int_num=?5 ????//int_num/0.0 ????// ????// ????// ????//數(shù)據(jù)類型的轉(zhuǎn)換,數(shù)據(jù)類型轉(zhuǎn)換如果數(shù)值超出范圍就會(huì)報(bào)錯(cuò),swift屬于強(qiáng)類型語(yǔ)言,不同類型的值經(jīng)常需要轉(zhuǎn)換 ????var?t_a:UInt8=100 ????var?t_b:UInt16=10 ????//類型不一樣,直接編譯出錯(cuò) ????//t_a=t_b; ????//t_b?=?t_a ????t_b?=?UInt16(t_a)//強(qiáng)制轉(zhuǎn)換時(shí)可以的 ????//Bool值只能用true和false,不能用0或非0?表示,其他類型的值也不轉(zhuǎn)化為bool值。在該使用bool值的地方一定要用Bool ????//這是不行的 ????//var?i?=?1 ????//if?i ????//{ ????//????// ????//} ????//var?i?=?true ????//if?i ????//{ ????//????//這是可以的 ????//} ????// ????//元組?:tuple?使用圓花括號(hào)把多個(gè)值復(fù)合成一個(gè)復(fù)合值,定義元組類型的變量 ????var?people?=?("zhangsan",14,170.00)?//這是系統(tǒng)推斷的方式 ????var?book?:(String,Float,Int)//可以事先聲明 ????book?=?("bookname",30.0,2) ????print(book) ????var?test?:?(Int,(Float,String))//元組成員又是元組 ????test?=?(10,(100.0,"bookName")) ????//元組訪問(wèn) ????print(test.0)//可以通過(guò)點(diǎn)加下標(biāo)的方式訪問(wèn) ????print(test.1.0) ????//元組的拆分 ????var?(num,(price,name))=test ????print("(num),(price),(name)") ????let?(c_num,(_,c_name))=test?//可以用下劃線表示要忽略元素 ????//可以使用key:value的形式為每個(gè)元組內(nèi)的變量指明名字 ????var?health?=?(height:175,weight:65)//可以直接寫(xiě)值 ????var?score?:?(swift:Int,name:String)//也可以后面直接跟這個(gè)變量類型聲明 ????score?=?(80,"real")?//不寫(xiě)指定值只能按照格式順序 ????score=(name:"real",swift:100)//指定值可以打亂順序.所以訪問(wèn)元組的數(shù)據(jù)也可以通過(guò)元組的變量名訪問(wèn) ????print(score.name) ????//可選類型?- ????var?str_val?=?"123" ????var?val1:Int??=?Int(str_val)?//.toInt這個(gè)方法找不到了,變成用構(gòu)造器轉(zhuǎn)換了不加?代碼編譯不過(guò)去,因?yàn)檗D(zhuǎn)換可能會(huì)失敗。 ????//如果沒(méi)有選擇?,表示職能轉(zhuǎn)換為Int,在轉(zhuǎn)化失敗的時(shí)候?屬于『值缺失』,需要處理值缺失的時(shí)候即使nil ????//Switf里面?nil和OC的不同,OC里面的nil表示一個(gè)不存在對(duì)象的指針,Swift里面的nil表示的是確定的值,表示值缺失 ????//只有可選類型的變量或常量才能接受nil,非可選的變量和常量不可以接受,一個(gè)可選類型沒(méi)有初始化,則值就是nil ????var?option_a:String??=?"1234" ????//?強(qiáng)制解析?:可選類型的變量和普通類型的變量不是相同的類型。比如不能直接把Int?直接轉(zhuǎn)換為Int,用!表示?已知該變量有值,請(qǐng)?zhí)崞鹌渲械闹? ????var?value:Int?=?Int(option_a!)!//------需要這樣寫(xiě)才能把可選類型的字符串轉(zhuǎn)化為整數(shù)?。?! ????var?n1?:Int??=?100 ????var?n2?:Int??=?50 ????let?n3?=?n1!+n2! ????print(n3) ????//強(qiáng)制解析必須是可選類型,并且里面確實(shí)有值才能成功,否則程序會(huì)出錯(cuò),可以使用?if?val!=nil?表示如果這個(gè)可選類型的變量不等于nil ????//可選綁定?:用于判斷可選類型的變量和常量是否有值,如果可選的有值就賦值給另一個(gè)臨時(shí)的變量或者常量 ????//可以在if分支對(duì)可選類型的變量進(jìn)行判斷 ????var?str?:String!="1234" ????if?var?tem?=?str//如果str的值為nil就不會(huì)去來(lái)這里了 ????{ ????????print(tem) ????} ????else ????{ ????????print("不能解析") ????} ????//隱式可選類型 ????//除了在任意已有類型的后面加?表示可選類型外,還可以在后面加!表示可選類型 ????//Int!和Int?區(qū)別是,當(dāng)程序需要獲取Int?類型的變量或常量值時(shí)候必須在變量后面添加!執(zhí)行強(qiáng)制解析, ????//Int!不用 ????var?aa?:Int??=?100 ????var?ab?:Int!?=?50 ????var?cc?:Int?=?aa! ????var?dd?:Int=ab ????//類型別名 ????//typealias?相當(dāng)?typedef ????//typealias?myInt??=?Int ????//?字符和字符串 ????//Character?表示單個(gè)字符?String?表示字符串,字符可以用單個(gè)字符,轉(zhuǎn)義字符,"u{n}"unicode編碼表示?n表示 ????//1-8位16進(jìn)制數(shù) ????var?chara:Character?=?"u{2666}" ????print(chara) ????chara?=?"好" ????str?=?"兩個(gè)不是圖片的星星??" ????//目前最新的swift?countElement已經(jīng)被改成了count ????print(str.characters.count) ????//插入字符串可以用字符串插值的方式 ????str?=?"前面插入了這些?(str)" ????//for?char?in?str??//無(wú)法編譯、 ????//{ ????//????print(char) ????//} ????// ????var?str_1?=?"first?
?//var?str_2?=?"firsy" ????//print(str_1==str_2) ????//var?hasPrefix:Bool?=?str_1.hasPrefix("first")//是否以特定的開(kāi)頭 ????//var?hasSuffix:Bool?=?str_2.hasSuffix("sy") ????// ????////訪問(wèn)字符串中的UNICODE碼 ????print("這里是UTF8編碼:能用UTF8表示的就顯示一個(gè)數(shù),不能用顯示的就會(huì)輸出多個(gè),每個(gè)表示一個(gè)字節(jié),分多個(gè)字節(jié)輸出,星星用了226?156?168表示對(duì)") ????for?codeUnit8?in?str_1.utf8//這里返回的是一個(gè)utf8View類型的值,是一個(gè)包含多個(gè)Utf8的值的集合 ????{ ????????print(codeUnit8,terminator:"?")//現(xiàn)在改成這個(gè)了?不換行輸出用這個(gè)語(yǔ)句 ????} ????print("這里是UTF16編碼:和UTF8類似,這里每個(gè)表示一個(gè)字節(jié)") ????for?codeUnit16?in?str_1.utf16//這里返回的是一個(gè)utf8View類型的值,是一個(gè)包含多個(gè)Utf8的值的集合 ????{ ????????print(codeUnit16,terminator:"?")//現(xiàn)在改成這個(gè)了?不換行輸出用這個(gè)語(yǔ)句 ????} ????////這里一個(gè)表示4個(gè)字節(jié)?unicodeScalars返回的?UnicodeScalarView類型的值?包含一個(gè)或多個(gè)unicodeScalar的值 ????////是一個(gè)21位的Unitcode碼,需要用.value屬性獲得數(shù)值是一個(gè)?Uint?32 ????//for?codeUnit32?in?str_1.unicodeScalars//這里返回的是一個(gè)utf8View類型的值,是一個(gè)包含多個(gè)Utf8的值的集合 ????//{ ????//????print(codeUnit32.value,terminator:"?")//現(xiàn)在改成這個(gè)了?不換行輸出用這個(gè)語(yǔ)句 ????// ????//} } study++; //-------------------------?運(yùn)算符 if?study?<?100 { ????//%求余數(shù)運(yùn)算符?,?可以對(duì)小數(shù)求余數(shù),兩個(gè)操作數(shù)都是整數(shù)不能對(duì)0求余,有一個(gè)是浮點(diǎn)數(shù),第二個(gè)可以是0.0或0結(jié)果是非數(shù),余數(shù)的正負(fù)只和和除數(shù)的正負(fù)相關(guān)。 ????//var?mod?=?7.5%1.2 ????// ????//print(mod)?//?=0.3 ????//溢出運(yùn)算符,如果希望程序只是對(duì)溢出的數(shù)據(jù)位進(jìn)行截?cái)?,而不是?dǎo)致錯(cuò)誤,可以使用Swift提供的溢出預(yù)算符 ????//&(+?-?*?/?%) ????//var?a?:UInt8?=?255 ????// ????//var?b:UInt8?=?255+a?//這樣竟然可以 ????// ????//a?=?a?&*?6?//溢出后進(jìn)行截?cái)嗖僮? ????//范圍運(yùn)算符?a...b?[a?b]?a..<b?[a?b) ????for??var?idx?in?0...100?//(0..<100) ????{ ????????print(idx) ????} ????//?引用比較對(duì)象運(yùn)算符?===?和?!====?用來(lái)判斷兩個(gè)引用類型的變量是否指向同一個(gè)對(duì)象。, ????//?==?用來(lái)比較內(nèi)容 ????var?d1?=?NSMutableArray(); ????var?d2?=?NSMutableArray(); ????//d1?==?d2?但是?d1!===d2 ????//nil?合并運(yùn)算符??"a??b"?用來(lái)在可選類型的變量a是否為nil,如果為nil就返回后者b的值,a和b的類型必須一致 ????//相當(dāng)于?a!=nil?a!:b } study++?; if?study?<?100 { ????//var?a=10 ????//if?a>0 ????//{ ????//????print(a)//即使這里只有一句?也必須用括號(hào)括起來(lái) ????//} ????//switch不用加break,每一個(gè)switch必須包含一條語(yǔ)句 ????//不能這樣 ????/** ????*?case?1: ????case?2: ????print(); ????但是可以這樣 ????case?1,2: ????print(); ????但是有的時(shí)候?yàn)榱耸褂肅語(yǔ)言里面的貫穿特性 ????可以使用fallthrough ????*/ ????var?num?=?5; ????switch?num ????{ ????case?5...10:?//可以表示范圍 ????????print(num) ????????//fallthrough?加上這句話下面的就會(huì)執(zhí)行 ????default: ????????print(num+1) ????} ????var?point:(x:Int,y:Int); ????point?=?(50,50) ????//(0,0)可以匹配到下面三個(gè),遇到第一個(gè)就跳出,所以應(yīng)該范圍小的條件放在前面 ????switch?point ????{ //????case?(x:0,y:0):??//(0,0)?也可以這樣, //????????print("位于原點(diǎn)") //????case?(_,0)://元組里面可以匹配范圍 //????????print("x軸>") //????case?(0,_): //????????print("位于Y軸") ????case?(0...100,0..0&&y>0:?//在case里面可以進(jìn)行再次篩選 ????????print("第一象限--》") ????default: ????????break; ????} ????//case的值 ????print(point) ????//循環(huán)結(jié)構(gòu) ????//var?cnt?=?10 ????//while?cnt?<?20 ????//{ ????//????print(cnt) ????//????cnt++ ????//} ????//do ????//{ ????//????cnt++ ????//}while?cnt<30 ????for?idx?in?0?..<?3?//for循環(huán) ????{ ????????print(idx) ????} ????for?var?a=0,b=0;a<0&&b<100;a++,b+=10//多個(gè)條件初始化 ????{ ????????print(a,b) ????} ????//for?;;?死循環(huán) ????//{ ????// ????//} ????//for?in?用于遍歷字符串,范圍,序列和集合等包含的元素?這里的常量無(wú)需聲明 ????/** ????*??for?常量名|_?in?字符串|范圍|集合 ????*/ ????var?friend?=?"myfriend" ????for?/*char*/_?in?friend.characters?//friend.characters?是最新的,原來(lái)只要寫(xiě)friend就行 ????{ ????????//?print(char) ????????print("kkk")//可以用?"_"來(lái)表示常量名,在不需要真正的遍歷內(nèi)容的時(shí)候可以用"_" ????} ????//這里的outer是一個(gè)標(biāo)簽,可以跳出到最外層的循環(huán),有點(diǎn)類似于C語(yǔ)言的go語(yǔ)句,但是swift里面的標(biāo)簽只有放在循環(huán) ????//開(kāi)頭出才有用,就像下面這樣 ????outer:for?i?in?0??..<?10 ????{ ????????inner:?for?j?in?0?..<?10 ????????{ ????????????print(i*j) ????????????if?i*j==4 ????????????{ ????????????????break?outer ????????????} ????????????if?j==7 ????????????{ ????????????????continue//不會(huì)跳出循環(huán) ????????????????//continue?outer?這里也可以跟一個(gè)標(biāo)簽。忽略標(biāo)簽所指定的循環(huán)中剩下的語(yǔ)句,默認(rèn)是inner ????????????} ????????} ????????//continue?outer發(fā)生后后這里的代碼不會(huì)執(zhí)行 ????} } //?-----------------------------------?4.集合 //var?myArrs?:Array;//這里是聲明,還不能用' // // //var?myArr2:[Int] //這是構(gòu)造器初始化 var?myArr?=?Array();//需要這樣才能用 myArr.append("one") myArr+["two"]?//可以這樣?寫(xiě)加入元素 var?myArr2?=?Array(count:?10,?repeatedValue:?"ones")//可以這樣 //這里是簡(jiǎn)化語(yǔ)法初始化 var?b?=?("books",15); var?values?=?["a","b","c"] //訪問(wèn)數(shù)組的元素可以使用下標(biāo) print(values[0]) values.count//數(shù)組的個(gè)數(shù) for?element?in?values { ????print(element) } values?.insert("d",?atIndex:?0) //數(shù)組的可變性和可修改性完全取決于是用let還是var //數(shù)組的下標(biāo)可以是范圍 values[0...1] //多維數(shù)組 var?secArr?:[[Int]]?//一個(gè)Int類型的二維數(shù)組 secArr?=?Array<Array>(count:?4,?repeatedValue:?[])//表示最外層的數(shù)組裝了四個(gè)一維數(shù)組 secArr[0]?=?Array(count:?5,?repeatedValue:?1) //----這樣的循環(huán)過(guò)時(shí)了,不知道怎么寫(xiě) for?var?i?=?0,len?=?secArr.count;i<len;i?+=?1 { ????for?var?j?=?0,len2?=?secArr[i].count;j<len2;j?+=?1 ????{ ????????print(secArr[i][j])//遍歷每個(gè)數(shù)組內(nèi)的數(shù)組元素 ????} } // var?n?=?4 var?drawArr?=?Array<Array>(count:?n,?repeatedValue:?[]);//聲明一個(gè)二維數(shù)組 for?i?in?0??..<?n? { ????drawArr[0]?=?Array(count:?n,?repeatedValue:?0) } drawArr[0].append(10) drawArr.removeLast(); var?i?=?0,j?=?0,?cur_pos?=?1 var?start?=?0; drawArr[0] //-------字典?鍵和值用冒號(hào)隔開(kāi) var?mydic:Dictionary=["key1":"value1","key2":"value2"] //聲明語(yǔ)法 var?scores:Dictionary//這里是逗號(hào), var?scores2:[String:String]?//這里是冒號(hào): //泛型創(chuàng)建字典 var?scores3:Dictionaryscores3?=?Dictionary(minimumCapacity:?5) //updateValue會(huì)返回一個(gè)字典內(nèi)value的可選類型的值(?),如果原來(lái)的鍵值對(duì)不存在 //就返回nil scores3.updateValue(100,?forKey:?"math") scores3["chinese"]=90 scores3["english"]=80 for?(item,score?)in?scores3//?前面是鍵后面對(duì)應(yīng)的是值 { ????print(item,score) ???? } var?keys?=?Array(scores3.keys)//必須用Array構(gòu)造器 scores3.count //字典的刪除 scores3.removeAll(); //集合的復(fù)制,包含的數(shù)據(jù)是值類型復(fù)制副本,引用類型復(fù)制指針 var?arr_ori?=?["one","two","three"] var?arr_cp1?=?arr_ori; var?arr_cp2?=?arr_ori arr_cp1[0]+="1" arr_cp2[0]+="2" print(arr_cp1[0]) print(arr_cp2[0]) //引用復(fù)制 class?User:?NSObject?{ ???? ????var?name:String ????init(name:String)?{ ????????self.name?=?name ????} } var?UserOri?=??[User(name:?"wokong"),User(name:?"bajie")] var?user1=UserOri; var?use2=UserOri user1[0].name="oo" use2[0].name="d" ----?5---------------------?閉包和函數(shù) study+=1; swift?不僅僅是面向?qū)ο蟮恼Z(yǔ)言 /* ? ?func?函數(shù)名(形式參數(shù)列表)[->返回值類型] ?{ ? ?} ?*/ func?max(x:Int,y:Int)?->?Int?{ ???? ????return?x>y???x:y } //支持多個(gè)返回值,需要元組的輔助 func?getmessage(person:String)?->?(String,String)?{ ???? ????return?("test","100") } getmessage("mine") //也可以指定元組的返回參數(shù) func?getmessage2(person:String)?->?(name:String,height:String)?{ ???? ????return?("test","100") } var?msg?=?getmessage2("test") print(msg.height,msg.name)?//可以通過(guò)屬性訪問(wèn) //遞歸函數(shù) func?fn(i:Int)?->?Int?{ ???? ????if?i==1?{ ????????return?i ????} ????else ????{ ????????return?i*fn(i-1); ????} } //fn()?這樣只有數(shù)據(jù)類型不直觀 print(fn(5)) //函數(shù)的形式參數(shù)?name和?msg都是參數(shù) func?sayHi(user?name:String,msg:String)?{ ???? ????print("程序正在執(zhí)行sayHi()函數(shù)") ????print("(name),(msg)") } //sayHi(user:?,?msg:?);//?指定參數(shù)名 //用局部形參名做形式參數(shù)名?-----?這里是swift修改了 // //func?sayHI2(#name:String)?->?Void?{ //???? //???? //} //形參默認(rèn)值,有默認(rèn)值的話調(diào)用的時(shí)候可以省略形參,一般把帶有默認(rèn)值的放在后面。 func?say2(user?name:String="孫悟空")?->?String?{ ???? ????return?name } print(say2()); //個(gè)數(shù)可變的形參,允許指定數(shù)量不確定的形參。在最有一個(gè)形參的類型后增加?...?表示可以接受多個(gè)參數(shù)值,多個(gè)參數(shù)值被當(dāng)成數(shù)組傳入 func?test(a?:Int,books:String...)?->?Void?{ ???? ????for?tmp?in?books?{ ???????? ????????print(tmp) ????} ???? } test(10,?books:?"OC","swift") //常量形參和變量形參,形參函數(shù)默認(rèn)的是常量,在函數(shù)內(nèi)不能對(duì)參數(shù)列表的形參進(jìn)行修改,如果需要直接使用形式參數(shù)做變量,而不需要在函數(shù)內(nèi)重新定義,需要用var //聲明函數(shù)形參 //這里用var修飾已經(jīng)提示過(guò)期了,就是參數(shù)就是不可修改的 func?test2(/*var*/?width:Double,height:Double)?->?Void?{ ???? //????width?=?100; ???? ????//?現(xiàn)在蘋果不能用var修飾了 ???? } //?in?out形參,用inout關(guān)鍵字聲明的形參可以進(jìn)行傳遞真實(shí)的值,不是副本,類似于 //C語(yǔ)言的傳地址,這里是可以修改的 func?test3(inout?a:Int,inout?b:Int)?->?Void?{ ???? ????a?=?a-b } //print(test3(&,?b:?&))?打出來(lái)就是這個(gè)樣子的 var?s_a?=?3,s_b=4; test3(&s_a,?b:?&s_b) print(s_a) //?函數(shù)類型?---?C語(yǔ)言里面的函數(shù)指針 var?p?=?test3;?//可以直把函數(shù)賦值 var?pType:(Int,Int)->Int pType?=?max; //函數(shù)類型做為參數(shù) func?fuc(a:Int,b:Int,p:(Int,Int)->Void)?->?Void?{ ???? ????p(a,b); } //函數(shù)重載,可以定義多個(gè)同名函數(shù),但是要形式參數(shù)或者返回值不相同。 //函數(shù)的嵌套。默認(rèn)的函數(shù)是全局的,嵌套在函數(shù)內(nèi)的函數(shù),在內(nèi)部有效,可以通過(guò) //前面的函數(shù)類型的返回值,返回具體的內(nèi)容函數(shù)供外部調(diào)用 //----------------嵌套函數(shù)和閉包?,閉包類似于Objective?-C?里面的代碼塊 //--?全局函數(shù)是一個(gè)有名稱,但是不會(huì)捕獲任何值的閉包。嵌套函數(shù)是一個(gè)有名字 //可以捕獲封閉函數(shù)體的值的閉包,閉包表達(dá)式是一個(gè)簡(jiǎn)潔的,可以捕獲封閉函數(shù)體的值的匿名閉包 //定義閉包 func?getMathFunc(type:String)?->(Int)->Int??{ ???? ???? ????switch?type?{ ????case?"square": ????????return{?(val:Int)?->Int?in?//閉包?,放在一個(gè)大括號(hào)內(nèi),沒(méi)有func關(guān)鍵字和函數(shù)名字 ?????????????return?val*val ????????} ????case?"cube": ????????return{?(val:Int)?->?Int?in ????????????return?val*val*val; ????????} ????default: ????????return?{ ????????????(val:Int)?->?Int?in ???????????? ????????????var?t?=?0; ????????????for??i?in?0...100 ????????????{ ????????????????t+=i; ????????????} ????????????return?val*t; ????????} ????} ???? } var?mathFunc?=?getMathFunc("cube"); print(mathFunc(5)); //省略形參名。閉包表達(dá)式可省略,返回值的情況下,關(guān)鍵字?in也可以省略,閉包表達(dá)式可以通過(guò)$0,$1,$2來(lái)引用第一個(gè),第二個(gè)。。。形參 //尾隨閉包 //函數(shù)的參數(shù)類型是函數(shù)類型和閉包類型是相同的,可以傳遞閉包也可以傳遞函數(shù) func?someFunction?(val:Int,fn:(Int)->(Int))->(Int) { ????//執(zhí)行代碼 ???return?fn(val) } var?sqare?=?{?(val:Int)->Int?in ????return?val*val;//閉包只有一行代碼,return?關(guān)鍵字 } print(someFunction(10,?fn:?sqare)) //這是普通閉包 someFunction(20,?fn:?{//放的是執(zhí)行體 ????(val:Int)->Int?in ????return?val*val;//閉包只有一行代碼,return?關(guān)鍵字 }) //這里是尾隨閉包 someFunction(20)//閉包表達(dá)式在花括號(hào)的外面 { ????(val:Int)->Int?in ????return?val*val;//閉包只有一行代碼,return?關(guān)鍵字 } //閉包捕獲上下文的變量和常量,可以修改上下文中的常量和變量,即使定義這些變量和常量的作用域不存在了,也可以訪問(wèn)和修改???? func?makeArray(ele:String)->()->[String]?//返回的是一個(gè)沒(méi)有參數(shù),返回值為String的函數(shù) { ????var?arr:[String]?=?[] ???? ????func?addElement()->[String] ????{ ????????arr.append(ele) ????????return?arr ????} ????return?addElement } //這注意 let?add1?=?makeArray("one") print(add1()) print(add1()) let?add2?=?makeArray("two") print(add2())//add2h額add1沒(méi)有關(guān)系 //閉包是引用類型 var?add3?=?add2?//add3?直接更改值 print(add3()) //------?面向?qū)ο笊?,除了定義自定義類還有枚舉,結(jié)構(gòu),類。都支持定義存儲(chǔ)屬性,計(jì)算屬性,方法,下標(biāo),高早起和嵌套類型 //------上面這句話暫時(shí)理解不了,信息量有點(diǎn)大呀。。。??說(shuō)支持所有的類型。類,結(jié)構(gòu)體,枚舉這三種程序單元的內(nèi)容分別可以定義屬性(存儲(chǔ)屬性和計(jì)算屬性),方法,下標(biāo),構(gòu)造器和嵌套類型(嵌套類,嵌套結(jié)構(gòu)體,嵌套枚舉) //5種類型的成員,這5種成員在類,結(jié)構(gòu)體,枚舉各有區(qū)別 //--?定義枚舉 enum?Season { ????case?Spring?//?case?關(guān)鍵字 ????case?Summer ????case?Fall ????case?Winter ???? ????//case?one,two?這樣也是可以的 }//?這里沒(méi)有給分配一個(gè)默認(rèn)的整數(shù)值。枚舉名就代表了一個(gè)實(shí)例。和整數(shù)沒(méi)有任何關(guān)系 //定義了swift任意類型后,以下幾方面使用 /* 1.聲明變量 2.創(chuàng)建實(shí)例 3.訪問(wèn)類型屬性 4.調(diào)用類型方法 5.派生子類 */ //聲明變量 var?sn?:Season; sn?=?Season.Spring//可以直接用枚舉的實(shí)例賦值 switch?(sn) { ????case?.Spring: ????????print("spring") ????case?.Summer: ????????print("summer") ????default?: ????print("default") } enum?enum2:Int { ????case?one,two=3,three?//one?=?0.three?=?4 } enum?enum3:Character?{ ????case?one?=?"O" } //要么不指定,要么全部都必須確定有值,指定屬性可以使用構(gòu)造器的屬性 var?day?=?enum2.init(rawValue:?3);//根據(jù)值獲取枚舉值,可能失敗的構(gòu)造器 var?day2?=?day?.rawValue //枚舉的關(guān)聯(lián)值 //case?枚舉值?(元組語(yǔ)法) enum?Planet { ????case?Earth(Double,String) ????case?Mars(density:Double,name:String) ????case?Sun } var?p1?=?Planet.Earth(1.0,?"地球") var?p2?=?Planet.Mars(density:?2.0,?name:?"火星") switch(p2) { ????case??Planet.Earth(var?weight,var?name):?//真是奇葩,可以這樣關(guān)聯(lián) ????????print(weight,name) ????default: ????????break; } //類和結(jié)構(gòu)體? /* ?區(qū)別: ?1結(jié)構(gòu)體不支持繼承 ?2.不支持自定義構(gòu)造器 ?3.結(jié)構(gòu)體是指類型,不是引用類型 ?*/ //swift的屬性分為?存儲(chǔ)屬性(實(shí)例變量)和計(jì)算屬性(相當(dāng)于property合成的屬性) //class表示一個(gè)屬性或者方法是否屬于類,static?用于結(jié)構(gòu)體和枚舉相當(dāng)于類里面的class class?person:??NSObject?{ ???? ????var?name:String=""http://必須初始化。 ????var?age:Int=0?; ????func?say()?->?Void?{ ???????? ????????print("(name)?--?(age)") ????} ????func?say(message:String)?->?Void?{//函數(shù)????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????持重載 ???????? ????????print("(message)") ????} ????func??growp(a:Int)?->?person?{ ???????? ????????age+=a ????????return?self ????} //????init(n:String,a:Int)?{//顯示?定義帶參數(shù)的構(gòu)造器,沒(méi)有自定義系統(tǒng)會(huì)提供一個(gè)默認(rèn)的 //???????? //????????self.age=a; //????????self.name=n //????} } var?per1?=?person(); per1.name?=?"P1" per1.age?=?0; per1.say() per1.say("消息") var?per2?=?person() per2.name="P1" per2.age=0; //===判斷應(yīng)用類型,==比較值類型,可以重載==號(hào),自己定義比較類型 func?==(p1:person,p2:person)?->?Bool??{ ???? ????if?p1.name==p2.name&&p1.age==p2.age?{ ???????? ????????return?true ????} ????return?false } print(per2==per1) per1.growp(1).growp(2)?//這里類似于OC里面的鏈?zhǔn)骄幊? //存儲(chǔ)屬性--?存儲(chǔ)在類,結(jié)構(gòu)體,枚舉內(nèi)部的常量或者變量。 struct?FixedLengthRange?{ ???? ????var?start:Int ????//定義常量存儲(chǔ)屬性 ????let?length?:Int ????//系統(tǒng)會(huì)為?"結(jié)構(gòu)體"???提供所有存儲(chǔ)屬性的構(gòu)造器,所以可以不指定初始值 } var?rg?=?FixedLengthRange(start:?2,?length:?3); //rg.length=0?初始化后就不能改 class?lazyC:?NSObject?{ ???? ????lazy?var?tem?=?100//懶加載關(guān)鍵在,類似于OC里面的重寫(xiě)get方法里面初始化,通過(guò).語(yǔ)法訪問(wèn)才初始化 } //計(jì)算屬性?property屬性,實(shí)例計(jì)算屬性和類計(jì)算屬性 enum?XBSeanon?:Int{ ????case?Spring,Summer,Fall,Winter ????//info就是計(jì)算屬性 ????var?info:String{ ????????//在這里寫(xiě)get和set方法 ????????get{ ????????????switch?self?{???//去掉get方法就是只讀屬性 ????????????case?.Spring: ????????????????return?"春" ????????????default: ????????????????return?"非春天" ????????????} ????????} ????????set(newValue)//這個(gè)形參可以省略, ????????{ ????????????if?newValue=="春天"?{ ????????????????self?=?.Spring ????????????} ????????????else ????????????{ ????????????????self?=?.Summer//瞎寫(xiě)測(cè)試 ????????????} ????????} ???? ????} ????mutating?func?changeV()?//mutatiing?表示可變,用在結(jié)構(gòu)體和枚舉 ????{ ????????self?=?XBSeanon(rawValue:?(self.rawValue+1)%3)! ????} } //var?mys?=?XBSeanon.Spring //print("(mys.info)")//get //mys.info?=?"春天" ////屬性觀察者。類似于KVO或者重寫(xiě)set方法實(shí)現(xiàn)的功能 class?User?{ ????//這里的屬性觀察沒(méi)有什么意義,因?yàn)闆](méi)有重寫(xiě)setter方法和getter方法,對(duì)屬性賦值操作檢查應(yīng)該在set方法做檢查, ????var?name?:String?=?""?{//不能監(jiān)聽(tīng)?wèi)屑虞d的熟悉 ???????? ????????willSet{ ????????????//這里放的是屬性賦值前,自動(dòng)要執(zhí)行的代碼 ????????????if?newValue.characters.countInt??//輸入?yún)?shù)不支持指定外部參數(shù),返回值可以返回任意類型,數(shù)組就是下標(biāo),字典就是value的類型 ????{ ????????get{ ????????????//定義一段可執(zhí)行的代碼, ????????????switch(idx) ????????????{ ????????????????case?0: ????????????????????return?self.x ????????????????case?1: ????????????????????return?self.y ????????????????case?2: ????????????????????return?self.width; ????????????????case?_?: ????????????????????return?self.heigth ???????????????? ????????????} ????????} ????????set ????????{ ????????????switch?(idx) ????????????{ ????????????????case?0: ????????????????????self.width?=?newValue ????????????????default: ????????????????????self.heigth?=?newValue ????????????} ????????} ????} ????//int?是訪問(wèn)的形式,可以是字符串,聯(lián)想字典?dict[@"one"]; ????subscript?(idx:Int)?->?String??//輸入?yún)?shù)不支持指定外部參數(shù),返回值可以返回任意類型,數(shù)組就是下標(biāo),字典就是value的類型 ????????{ ????????get{ ????????????//定義一段可執(zhí)行的代碼, ????????????switch(idx) ????????????{ ????????????case?0: ????????????????return?"width" ????????????case?1: ????????????????return?"height" ????????????case?2: ????????????????return?"x" ????????????case?_?: ????????????????return?"y" ????????????} ????????} ????????set ????????{ ????????????switch?(idx) ????????????{ ????????????case?0: ????????????????self.width?=?12 ????????????default: ????????????????self.heigth?=?123 ????????????} ????????} ????} ???? } var?rect?=?FKRect(x:?0,?y:?0,?width:?100,?heigth:?100) rect[0]=100?//通過(guò)下標(biāo)引用 var?num:String?=?rect[0] print(rect.width) //--------------------------可選擇鏈 //可選鏈代替強(qiáng)制解析 class?BOOK?{ ???? ????var?bookName:String! ????init(name:String) ????{ ????????self.bookName?=?name ????} } class?Student?{ ???? ????var?book:BOOK! ???? } class?School?{ ???? ????var?stu:Student! } var?school?=?School() //print(school.stu.book)//?這樣寫(xiě)就錯(cuò)了??梢园?!換成?作為可選鏈。!表示隱式解析,?表示可選鏈。中間有一個(gè)為nil就會(huì)返回nil,不會(huì)繼續(xù)向后執(zhí)行。 print(school.stu?.book) //可選鏈?適用于?屬性,方法,下標(biāo) //-----類屬性和類方法?(枚舉,類,結(jié)構(gòu)體自身的方法) //--值的類型屬性包含枚舉和結(jié)構(gòu)體,用static修飾,包含存儲(chǔ)屬性和計(jì)算屬性?!啊薄啊鳖惖念愋蛯傩灾荒芏x計(jì)算屬性“”“”“”“ //構(gòu)造器---無(wú)須顯示的聲明返回值類型,無(wú)須顯示的使用return返回實(shí)例,名字都是init函數(shù),可以有多個(gè)函數(shù)重載 /** ?*??對(duì)于結(jié)構(gòu)體提供兩個(gè)構(gòu)造器,無(wú)參數(shù)的和初始化所有的。對(duì)于類提供了無(wú)參數(shù)的。需要自定義的時(shí)候就自定義,自定義后就不在提供默認(rèn)的 ? ? ?構(gòu)造器的外部參數(shù)和局部參數(shù)相同--swift做的。 ?*/ class?TestInit?{ ???? ????var?name:String? ????let?const?=?10 //???? //????init(_?n:String) //????{ //????????self.name?=?n //????????//self.const?=?100//這里是不能被修改的。據(jù)課本上說(shuō)原來(lái)是可以的 //????} ????//構(gòu)造器也可以重載 ????//可能失敗的構(gòu)造器, ????init?(_?n:String)//可能失敗的構(gòu)造器 ????{ ????????if?n.characters.countInt ????{ ????????return?Str.characters.count; ????} } //?--?協(xié)議 @objc?protocol?Draw?//可選類型要有objc符號(hào) { ????@objc?optional ????var?drawCirle:Double{get?set};//屬性 ????func?drawCubic(width:Double);//方法 } class?SwitftDraw:Draw { ???? ????@objc?var?drawCirle:Double ????????{ ????????get{ ????????????return?self.drawCirle; ????????} ????????set ????????{ ????????????self.drawCirle?=?newValue; ????????} ????} ????@objc?func?drawCubic(width:?Double)?{ ???????? ????????print("立方體?(width)") ????} } //泛型?類型占位符 func?copyArray(src:[T],inout?dest:[T]) { ???? ????for?element?in?src ????{ ????????dest.append(element) ????} ???? } //這個(gè)方法可以復(fù)制任意類型的數(shù)組 //可以定義多個(gè)不同的參數(shù) func?projection(src?:[SrcType],fn:(SrcType)->DesType)?->[DesType] { ????var?result?=?[DesType](); ????for?element?in?src ????{ ????????result.append(fn(element)); ????} ????return?result; } var?books?=?["C和指針","算法導(dǎo)論"] var?proj?=?projection(books){ ???? ????$0.characters.count } //類也可以使用泛型 class?AppleS//這里通過(guò)協(xié)議對(duì)泛型進(jìn)行限定 { ????var?info:T ????init(info:T) ????{ ????????self.info?=?info ????} } extension?AppleS { ????//擴(kuò)展類可以直接使用泛型 ????func?bigThan(other:AppleS,fn:(T,T)?->Int)?->Bool?{ ???????? ????????if?fn(self.info,other.info)>0 ????????{ ????????????return?true; ????????} ????????else ????????{ ????????????return?false; ????????} ????} }