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(“奔跑吧,哈哈”)
}
}