當(dāng)前位置:首頁(yè) > 芯聞號(hào) > 充電吧
[導(dǎo)讀]swift 最基本的學(xué)習(xí)結(jié)束了,但是很多細(xì)節(jié)問(wèn)題都沒(méi)有搞的太明白,看以后的使用情況吧,在應(yīng)用中再深入理解。明天就可以用swift開(kāi)發(fā)項(xiàng)目了,高興!//:?Playground?-?noun:?a?pl

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;
????????}
????}
}
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉