swift學(xué)習(xí)代碼筆記
swift 最基本的學(xué)習(xí)結(jié)束了,但是很多細(xì)節(jié)問題都沒有搞的太明白,看以后的使用情況吧,在應(yīng)用中再深入理解。明天就可以用swift開發(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)語句相關(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長度等于所在平臺的原生字長,細(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)制表示,支持下劃線分開
????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開頭,p代表4
????//的p次方?=?0x5.a2?*?2^4
????//浮點(diǎn)數(shù)提供了正無窮大,負(fù)無窮大和非數(shù)?三個(gè)?特殊的浮點(diǎn)數(shù)。
????//正的浮點(diǎn)數(shù)?除以0.0得到正無窮,負(fù)的浮點(diǎn)數(shù)除以0.0得到負(fù)無窮,0.0除以0.0的非數(shù)
????var?float_a?=?5.0,float_b?=?-5.0
????print("正無窮和正無窮相等(float_a/0.0==(4.0/0.0)),負(fù)無窮和負(fù)無窮相等(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)類型語言,不同類型的值經(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?使用圓花括號把多個(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"))
????//元組訪問
????print(test.0)//可以通過點(diǎn)加下標(biāo)的方式訪問
????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)//可以直接寫值
????var?score?:?(swift:Int,name:String)//也可以后面直接跟這個(gè)變量類型聲明
????score?=?(80,"real")?//不寫指定值只能按照格式順序
????score=(name:"real",swift:100)//指定值可以打亂順序.所以訪問元組的數(shù)據(jù)也可以通過元組的變量名訪問
????print(score.name)
????//可選類型?-
????var?str_val?=?"123"
????var?val1:Int??=?Int(str_val)?//.toInt這個(gè)方法找不到了,變成用構(gòu)造器轉(zhuǎn)換了不加?代碼編譯不過去,因?yàn)檗D(zhuǎn)換可能會(huì)失敗。
????//如果沒有選擇?,表示職能轉(zhuǎn)換為Int,在轉(zhuǎn)化失敗的時(shí)候?屬于『值缺失』,需要處理值缺失的時(shí)候即使nil
????//Switf里面?nil和OC的不同,OC里面的nil表示一個(gè)不存在對象的指針,Swift里面的nil表示的是確定的值,表示值缺失
????//只有可選類型的變量或常量才能接受nil,非可選的變量和常量不可以接受,一個(gè)可選類型沒有初始化,則值就是nil
????var?option_a:String??=?"1234"
????//?強(qiáng)制解析?:可選類型的變量和普通類型的變量不是相同的類型。比如不能直接把Int?直接轉(zhuǎn)換為Int,用!表示?已知該變量有值,請?zhí)崞鹌渲械闹?
????var?value:Int?=?Int(option_a!)!//------需要這樣寫才能把可選類型的字符串轉(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分支對可選類型的變量進(jìn)行判斷
????var?str?:String!="1234"
????if?var?tem?=?str//如果str的值為nil就不會(huì)去來這里了
????{
????????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??//無法編譯、
????//{
????//????print(char)
????//}
????//
????var?str_1?=?"first??//var?str_2?=?"firsy"
????//print(str_1==str_2)
????//var?hasPrefix:Bool?=?str_1.hasPrefix("first")//是否以特定的開頭
????//var?hasSuffix:Bool?=?str_2.hasSuffix("sy")
????//
????////訪問字符串中的UNICODE碼
????print("這里是UTF8編碼:能用UTF8表示的就顯示一個(gè)數(shù),不能用顯示的就會(huì)輸出多個(gè),每個(gè)表示一個(gè)字節(jié),分多個(gè)字節(jié)輸出,星星用了226?156?168表示對")
????for?codeUnit8?in?str_1.utf8//這里返回的是一個(gè)utf8View類型的值,是一個(gè)包含多個(gè)Utf8的值的集合
????{
????????print(codeUnit8,terminator:"?")//現(xiàn)在改成這個(gè)了?不換行輸出用這個(gè)語句
????}
????print("這里是UTF16編碼:和UTF8類似,這里每個(gè)表示一個(gè)字節(jié)")
????for?codeUnit16?in?str_1.utf16//這里返回的是一個(gè)utf8View類型的值,是一個(gè)包含多個(gè)Utf8的值的集合
????{
????????print(codeUnit16,terminator:"?")//現(xiàn)在改成這個(gè)了?不換行輸出用這個(gè)語句
????}
????////這里一個(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è)語句
????//
????//}
}
study++;
//-------------------------?運(yùn)算符
if?study?<?100
{
????//%求余數(shù)運(yùn)算符?,?可以對小數(shù)求余數(shù),兩個(gè)操作數(shù)都是整數(shù)不能對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)算符,如果希望程序只是對溢出的數(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)
????}
????//?引用比較對象運(yùn)算符?===?和?!====?用來判斷兩個(gè)引用類型的變量是否指向同一個(gè)對象。,
????//?==?用來比較內(nèi)容
????var?d1?=?NSMutableArray();
????var?d2?=?NSMutableArray();
????//d1?==?d2?但是?d1!===d2
????//nil?合并運(yùn)算符??"a??b"?用來在可選類型的變量a是否為nil,如果為nil就返回后者b的值,a和b的類型必須一致
????//相當(dāng)于?a!=nil?a!:b
}
study++?;
if?study?<?100
{
????//var?a=10
????//if?a>0
????//{
????//????print(a)//即使這里只有一句?也必須用括號括起來
????//}
????//switch不用加break,每一個(gè)switch必須包含一條語句
????//不能這樣
????/**
????*?case?1:
????case?2:
????print();
????但是可以這樣
????case?1,2:
????print();
????但是有的時(shí)候?yàn)榱耸褂肅語言里面的貫穿特性
????可以使用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?用于遍歷字符串,范圍,序列和集合等包含的元素?這里的常量無需聲明
????/**
????*??for?常量名|_?in?字符串|范圍|集合
????*/
????var?friend?=?"myfriend"
????for?/*char*/_?in?friend.characters?//friend.characters?是最新的,原來只要寫friend就行
????{
????????//?print(char)
????????print("kkk")//可以用?"_"來表示常量名,在不需要真正的遍歷內(nèi)容的時(shí)候可以用"_"
????}
????//這里的outer是一個(gè)標(biāo)簽,可以跳出到最外層的循環(huán),有點(diǎn)類似于C語言的go語句,但是swift里面的標(biāo)簽只有放在循環(huán)
????//開頭出才有用,就像下面這樣
????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)中剩下的語句,默認(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"]?//可以這樣?寫加入元素
var?myArr2?=?Array(count:?10,?repeatedValue:?"ones")//可以這樣
//這里是簡化語法初始化
var?b?=?("books",15);
var?values?=?["a","b","c"]
//訪問數(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)過時(shí)了,不知道怎么寫
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]
//-------字典?鍵和值用冒號隔開
var?mydic:Dictionary=["key1":"value1","key2":"value2"]
//聲明語法
var?scores:Dictionary//這里是逗號,
var?scores2:[String:String]?//這里是冒號:
//泛型創(chuàng)建字典
var?scores3:Dictionaryscores3?=?Dictionary(minimumCapacity:?5)
//updateValue會(huì)返回一個(gè)字典內(nèi)value的可選類型的值(?),如果原來的鍵值對不存在
//就返回nil
scores3.updateValue(100,?forKey:?"math")
scores3["chinese"]=90
scores3["english"]=80
for?(item,score?)in?scores3//?前面是鍵后面對應(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言
/*
?
?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)?//可以通過屬性訪問
//遞歸函數(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)不能對參數(shù)列表的形參進(jìn)行修改,如果需要直接使用形式參數(shù)做變量,而不需要在函數(shù)內(nèi)重新定義,需要用var
//聲明函數(shù)形參
//這里用var修飾已經(jīng)提示過期了,就是參數(shù)就是不可修改的
func?test2(/*var*/?width:Double,height:Double)?->?Void?{
????
//????width?=?100;
????
????//?現(xiàn)在蘋果不能用var修飾了
????
}
//?in?out形參,用inout關(guān)鍵字聲明的形參可以進(jìn)行傳遞真實(shí)的值,不是副本,類似于
//C語言的傳地址,這里是可以修改的
func?test3(inout?a:Int,inout?b:Int)?->?Void?{
????
????a?=?a-b
}
//print(test3(&,?b:?&))?打出來就是這個(gè)樣子的
var?s_a?=?3,s_b=4;
test3(&s_a,?b:?&s_b)
print(s_a)
//?函數(shù)類型?---?C語言里面的函數(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)部有效,可以通過
//前面的函數(shù)類型的返回值,返回具體的內(nèi)容函數(shù)供外部調(diào)用
//----------------嵌套函數(shù)和閉包?,閉包類似于Objective?-C?里面的代碼塊
//--?全局函數(shù)是一個(gè)有名稱,但是不會(huì)捕獲任何值的閉包。嵌套函數(shù)是一個(gè)有名字
//可以捕獲封閉函數(shù)體的值的閉包,閉包表達(dá)式是一個(gè)簡潔的,可以捕獲封閉函數(shù)體的值的匿名閉包
//定義閉包
func?getMathFunc(type:String)?->(Int)->Int??{
????
????
????switch?type?{
????case?"square":
????????return{?(val:Int)?->Int?in?//閉包?,放在一個(gè)大括號內(nè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á)式可以通過$0,$1,$2來引用第一個(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á)式在花括號的外面
{
????(val:Int)->Int?in
????return?val*val;//閉包只有一行代碼,return?關(guān)鍵字
}
//閉包捕獲上下文的變量和常量,可以修改上下文中的常量和變量,即使定義這些變量和常量的作用域不存在了,也可以訪問和修改????
func?makeArray(ele:String)->()->[String]?//返回的是一個(gè)沒有參數(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沒有關(guān)系
//閉包是引用類型
var?add3?=?add2?//add3?直接更改值
print(add3())
//------?面向?qū)ο笊希硕x自定義類還有枚舉,結(jié)構(gòu),類。都支持定義存儲屬性,計(jì)算屬性,方法,下標(biāo),高早起和嵌套類型
//------上面這句話暫時(shí)理解不了,信息量有點(diǎn)大呀。。。??說支持所有的類型。類,結(jié)構(gòu)體,枚舉這三種程序單元的內(nèi)容分別可以定義屬性(存儲屬性和計(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?這樣也是可以的
}//?這里沒有給分配一個(gè)默認(rèn)的整數(shù)值。枚舉名就代表了一個(gè)實(shí)例。和整數(shù)沒有任何關(guān)系
//定義了swift任意類型后,以下幾方面使用
/*
1.聲明變量
2.創(chuàng)建實(shí)例
3.訪問類型屬性
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?枚舉值?(元組語法)
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的屬性分為?存儲屬性(實(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)造器,沒有自定義系統(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)用類型,==比較值類型,可以重載==號,自己定義比較類型
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)骄幊?
//存儲屬性--?存儲在類,結(jié)構(gòu)體,枚舉內(nèi)部的常量或者變量。
struct?FixedLengthRange?{
????
????var?start:Int
????//定義常量存儲屬性
????let?length?:Int
????//系統(tǒng)會(huì)為?"結(jié)構(gòu)體"???提供所有存儲屬性的構(gòu)造器,所以可以不指定初始值
}
var?rg?=?FixedLengthRange(start:?2,?length:?3);
//rg.length=0?初始化后就不能改
class?lazyC:?NSObject?{
????
????lazy?var?tem?=?100//懶加載關(guān)鍵在,類似于OC里面的重寫get方法里面初始化,通過.語法訪問才初始化
}
//計(jì)算屬性?property屬性,實(shí)例計(jì)算屬性和類計(jì)算屬性
enum?XBSeanon?:Int{
????case?Spring,Summer,Fall,Winter
????//info就是計(jì)算屬性
????var?info:String{
????????//在這里寫get和set方法
????????get{
????????????switch?self?{???//去掉get方法就是只讀屬性
????????????case?.Spring:
????????????????return?"春"
????????????default:
????????????????return?"非春天"
????????????}
????????}
????????set(newValue)//這個(gè)形參可以省略,
????????{
????????????if?newValue=="春天"?{
????????????????self?=?.Spring
????????????}
????????????else
????????????{
????????????????self?=?.Summer//瞎寫測試
????????????}
????????}
????
????}
????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或者重寫set方法實(shí)現(xiàn)的功能
class?User?{
????//這里的屬性觀察沒有什么意義,因?yàn)闆]有重寫setter方法和getter方法,對屬性賦值操作檢查應(yīng)該在set方法做檢查,
????var?name?:String?=?""?{//不能監(jiān)聽?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?是訪問的形式,可以是字符串,聯(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?//通過下標(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)//?這樣寫就錯(cuò)了。可以把!換成?作為可選鏈。!表示隱式解析,?表示可選鏈。中間有一個(gè)為nil就會(huì)返回nil,不會(huì)繼續(xù)向后執(zhí)行。
print(school.stu?.book)
//可選鏈?適用于?屬性,方法,下標(biāo)
//-----類屬性和類方法?(枚舉,類,結(jié)構(gòu)體自身的方法)
//--值的類型屬性包含枚舉和結(jié)構(gòu)體,用static修飾,包含存儲屬性和計(jì)算屬性?!啊薄啊鳖惖念愋蛯傩灾荒芏x計(jì)算屬性“”“”“”“
//構(gòu)造器---無須顯示的聲明返回值類型,無須顯示的使用return返回實(shí)例,名字都是init函數(shù),可以有多個(gè)函數(shù)重載
/**
?*??對于結(jié)構(gòu)體提供兩個(gè)構(gòu)造器,無參數(shù)的和初始化所有的。對于類提供了無參數(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ù)課本上說原來是可以的
//????}
????//構(gòu)造器也可以重載
????//可能失敗的構(gòu)造器,
????init?(_?n:String)//可能失敗的構(gòu)造器
????{
????????if?n.characters.countInt
????{
????????return?Str.characters.count;
????}
}
//?--?協(xié)議
@objc?protocol?Draw?//可選類型要有objc符號
{
????@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//這里通過協(xié)議對泛型進(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;
????????}
????}
} 




