swift 閉包

Swift中的閉包谜叹,是一個自包含的函數(shù)代碼塊,可以再代碼中傳遞和使用侠碧,作為對象來傳送硝枉,作為函數(shù)來使用廉丽,類似于OC中的block函數(shù)
可以捕獲和存儲所在上下文中任意的常量和變量的引用,也就是閉合并且包裹著這些常量或變量妻味,俗稱為閉包正压;
在Swift中,會自動管理在捕獲過程中涉及到的內存操作责球;
1焦履、語法
{(參數(shù):參數(shù)類型 。雏逾。嘉裤。) ->返回值類型 in
//執(zhí)行語句
}
2、具體使用:sort函數(shù)栖博,是系統(tǒng)提供的一個排序函數(shù)屑宠,用于對數(shù)組中的元素進行排序,但是不會修改原來數(shù)組仇让,(僅僅是排序輸出)
let name = [“Asd”, “Jkas”, “Fdhk”, “Lsjd”]
//比較大小的排序函數(shù)
func prepare(para1: String, para2: String) -> Bool {
return para1 < para2
}
var newNames = names.sort( prepare) //實質上是將自定義的比較函數(shù)整個作為參數(shù)傳給sort函數(shù)
3典奉、使用閉包的語法-實現(xiàn)排序
newName = names.sort({ para1: String , para2 : String})-> Bool in {
return para1 < para2
})
4、根據(jù)上下文推斷類型 - (閉包的簡寫)
在swift中丧叽,系統(tǒng)可以自動的推斷參數(shù)和返回值的類型
newNames = names.sort({para1, para2 in
return para1 < para2
})
5卫玖、單表達式閉包隱試返回 - (閉包的簡寫)
可以通過隱藏return關鍵字來達到隱試返回的目的
newNames = names.sort({ para1, para2 in
para1 < para2
})
尾隨閉包:(自己去了解)

三、枚舉
在C語言中踊淳,枚舉將枚舉名和一個整形的值相對應假瞬,但是Swift中,枚舉更加靈活迂尝,不必給每一個枚舉成員提供一個值脱茉。如果給枚舉值成員提供一個值,該值得類型可以是:字符串雹舀、字符芦劣、整形或浮點型。另外说榆,枚舉成員可以指定任何類型的相關值存儲到枚舉成員中虚吟;
1、語法签财,
定義枚舉 enum關鍵字
enum Direction { //枚舉名的第一個字母必須大寫
case North //case 關鍵詞表明新的一行成員值將被定義串慰。
case West, case East , case South //多個成員值可以出現(xiàn)在同一行上,用逗號隔開
}
【注意:】1唱蒸、和 C 和 Objective-C 不同邦鲫,Swift 的枚舉成員在被創(chuàng)建時不會被賦予一個默認的整型值。在上面的CompassPoints例子中,North庆捺,South古今,East和West不會隱式地賦值為了0,1滔以,2和3捉腥。
2、枚舉名字(例如CompassPoint和Planet)必須以一個大寫字母開頭你画。
2抵碟、枚舉的使用
var direction = Direction.East;
direction = .South //枚舉在被初次初始化之后,獲取另外的值時坏匪,可以直接使用 “.” 語法調用
3拟逮、枚舉與Switch語句配合使用
switch direction {
case .North:
case .South:
case .West:
case .east
}
//在判斷一個枚舉類型的值時,switch語句必須窮舉所有情況适滓。如果忽略了.West這種情況敦迄,上面那段代碼將無法通過編譯,因為它沒有考慮到CompassPoint的全部成員粒竖。強制性全部窮舉的要求確保了枚舉成員不會被意外遺漏颅崩。
//當不需要匹配每個枚舉成員的時候,你可以提供一個默認default分支來涵蓋所有未明確被提出的枚舉成員

四蕊苗、類和結構體
1沿后、定義:
類的定義:關鍵字 class
class Person {
var name = “” //定義屬性
}
結構體定義:關鍵字 struct
struct Student {
var name = “” //定義屬性
}
2、實例化:
類:Person 類的實例化 : var per = Person()
類的屬性賦值:per.name = “墨觴”
print(“姓名:(per.name)”)
結構體:Student 實例化 :var stu = Student()
結構體的屬性賦值:stu.name = “夜凰”
print(“姓名:(stu.name)”)
3朽砰、類與結構體的混合編程
struct Hand {
var number = 0
}
class Child {
var name = “”
var age = 0
//當類中包含自定義的類時尖滚,需要將包含的類型進行初始化
var hands : Hand = Hand() //將 結構體Hand 作為類型標注
}
var child = Child() //實例化Child類
child.name = “夜凰” //給屬性賦值
child.age = 5
child.hands.number = 2 //可以直接通過“.語法”就可調用
4、逐一構造器
結構體具有逐一構造器瞧柔,但是類沒有漆弄,因為結構體是值類型,類是引用類型
struct Dog {
var name = “”
var age = 0
}
var dog = Dog() //普通實例化
逐一構造器:在實例化結構體的同時造锅,對屬性進行賦值撼唾。
var dog = Dog(name: “夜凰”, age: 12)
5哥蔚、值類型
特點:當賦值給變量倒谷、常量、或函數(shù)時糙箍,實質上是 拷貝渤愁。
var dog1 = dog //拷貝關系
dog.name = “墨觴” //對原始數(shù)據(jù)進行更改,不影響被拷貝的類
在 Swift 中深夯,所有的基本類型:整數(shù)(Integer)抖格、浮點數(shù)(floating-point)、布爾值(Boolean)、字符串(string)雹拄、數(shù)組(array)和字典(dictionary)收奔,都是值類型,并且都是以結構體的形式在后臺所實現(xiàn)办桨。
在 Swift 中筹淫,所有的結構體和枚舉類型都是值類型。這意味著它們的實例呢撞,以及實例中所包含的任何值類型屬性,在代碼中傳遞的時候都會被復制饰剥。
6殊霞、引用類型
與值類型不同,引用類型在被賦予到一個變量汰蓉、常量或者被傳遞到一個函數(shù)時绷蹲,操作的是做了指針的指向,其并不是拷貝顾孽。
class Cat {
var name = “”
var age = 0
}
var cat = Cat()
cat.name = “貓咪”
var cat1 = cat
cat.name = “小貓” //由于不是拷貝關系祝钢,原始文件被改變時,新生成的文件也會發(fā)生變化

類與結構體的相同點和不同點
相同點:
· 定義屬性用于存儲值
· 定義方法用于提供功能
· 定義附屬腳本用于訪問值
· 定義構造器用于生成初始化值
· 通過擴展以增加默認實現(xiàn)的功能
· 實現(xiàn)協(xié)議以提供某種標準功能
· 定義方式一樣
不同點:
1若厚、關鍵字不同拦英, 類:class 結構體:struct
2、實例化時测秸,結構體有逐一構造器疤估,類沒有
3、結構體是值類型霎冯,類是引用類型
聯(lián)系:可以將結構體作為類型標注在類中使用铃拇,(混合編程)

類還有如下的附加功能:
· 繼承允許一個類繼承另一個類的特征
· 類型轉換允許在運行時檢查和解釋一個類實例的類型
· 解構器允許一個類實例釋放任何其所被分配的資源
· 引用計數(shù)允許對一個類的多次引用

注意: 結構體總是通過被復制的方式在代碼中傳遞,因此請不要使用引用計數(shù)沈撞。

7慷荔、實例方法和類方法的使用
class Tiger {
var name = “”
var age = 0
//創(chuàng)建實例方法
func eat() {
print(“practice makes perfect”)
self.name = “tiger” //在實例方法中,self表示當前類的對象
}
func run( name: String) {
self.name = name //self可以區(qū)分屬性和形參
}
//創(chuàng)建類方法 :通過關鍵字static或者class關鍵字標明
//在實例方法前面添加關鍵字缠俺,變?yōu)轭惙椒?br> static func bark(){
print(“你好”)
}
}
//如何調用類方法和實例方法
//實例化
var tiger = Tiger()
//調用實例方法,通過對象調用
tiger.eat()
//調用類方法,通過類名直接調用
Tiger.bark()

類方法與實例方法的相同點與不同點
相同點:
1显晶、實質上都是函數(shù)
2、都可以對類的屬性進行修改
不同點:
1晋修、聲明時吧碾,類方法使用關鍵字:static或class ,實例方法不需要
2墓卦、調用時倦春,實例方法只能通過類的對象調用,類方法可以通過類名直接調用

8、在值類型(結構體)中睁本,修改屬性
strut Student1 {
var number = 100
var grade = 2
//在值類型中尿庐,定義實例方法,并在實例方法中修改結構體的屬性呢堰,需要使用關鍵字mutating
mutating func study() {
self.number = 60
}
//在實例方法中抄瑟,直接對self進行修改
mutating func play() {
//使用逐一構造器
self = Student1(number: 20, grade: 5)
}
}
var stu1 = Student1()
stu1.play()
stu1.study()

9、類的繼承
class Car{
var carName = “”
var price = 0.0
// 可以在父類的實例方法中枉疼,添加final關鍵字皮假,設置此方法不被子類調用
func run(){
print(“奔跑吧,逗逼”)
}
}
//通過類的繼承骂维,子類可以繼承父類所有的方法和屬性惹资,和OC一樣,swift中不允許多繼承
class AutoCar: Car {
var factory = “藍翔”
}
var autoCar = AutoCar()
autoCar.carName = “瑪莎拉蒂”
autoCar.price = 0.1
autoCar.run()

class Bicycle : Car {
//在子類中航闺,如果要重寫父類方法褪测,需要用 override關鍵字進行標明
override func run() {
print(“奔跑吧,哈哈”)
}
}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末潦刃,一起剝皮案震驚了整個濱河市侮措,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乖杠,老刑警劉巖分扎,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異滑黔,居然都是意外死亡笆包,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門略荡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來庵佣,“玉大人,你說我怎么就攤上這事汛兜“头啵” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵粥谬,是天一觀的道長肛根。 經常有香客問我,道長漏策,這世上最難降的妖魔是什么派哲? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮掺喻,結果婚禮上芭届,老公的妹妹穿的比我還像新娘储矩。我一直安慰自己,他們只是感情好褂乍,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布持隧。 她就那樣靜靜地躺著,像睡著了一般逃片。 火紅的嫁衣襯著肌膚如雪屡拨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天褥实,我揣著相機與錄音呀狼,去河邊找鬼。 笑死性锭,一個胖子當著我的面吹牛赠潦,可吹牛的內容都是我干的。 我是一名探鬼主播草冈,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瓮增!你這毒婦竟也來了怎棱?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤绷跑,失蹤者是張志新(化名)和其女友劉穎拳恋,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體砸捏,經...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡谬运,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了垦藏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梆暖。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖掂骏,靈堂內的尸體忽然破棺而出轰驳,到底是詐尸還是另有隱情,我是刑警寧澤弟灼,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布级解,位于F島的核電站,受9級特大地震影響田绑,放射性物質發(fā)生泄漏勤哗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一掩驱、第九天 我趴在偏房一處隱蔽的房頂上張望芒划。 院中可真熱鬧冬竟,春花似錦、人聲如沸腊状。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缴挖。三九已至袋狞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間映屋,已是汗流浹背苟鸯。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留棚点,地道東北人早处。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像瘫析,于是被迫代替她去往敵國和親砌梆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內容

  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,815評論 1 10
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理贬循,服務發(fā)現(xiàn)咸包,斷路器,智...
    卡卡羅2017閱讀 134,672評論 18 139
  • 132.轉換錯誤成可選值 通過轉換錯誤成一個可選值,你可以使用 try? 來處理錯誤杖虾。當執(zhí)行try?表達式時,如果...
    無灃閱讀 1,257評論 0 3
  • 1. 閉包 ** 閉包**函數(shù)是閉包的一種類似于OC語言中block閉包的表達式(匿名函數(shù))--能夠捕獲上下文中的...
    高俊閱讀 443評論 0 1
  • 最近愛上了攝影烂瘫,一個人背上相機,到處跑奇适,看到有趣的事物坟比,感動的場景,都想用鏡頭去記錄嚷往,把這份美好記下葛账,保存在歲月中...
    有個妞叫小美閱讀 194評論 1 2