1、范型
范型所解決的問(wèn)題
函數(shù)堪侯、方法伍宦、類型:類,結(jié)構(gòu)體遇骑,枚舉亥啦,元組類型翔脱,協(xié)議
參數(shù)碍侦,返回值,成員函數(shù)參數(shù)枚驻,成員屬性
類型不確定再登, 就用一個(gè)范型锉矢, 可以根據(jù)實(shí)參指定的類型灯节,動(dòng)態(tài)改變類型
在 函數(shù)的名字后面 用尖括號(hào)表示
在 類型的定義 類型名字后面炎疆, 用尖括號(hào)表示
范型函數(shù)
返回類型是范型
傳入?yún)?shù)是范型
類型參數(shù)
占位類型
命名類型參數(shù)
類型參數(shù) 是有一個(gè)描述性名字的
Dictionary<Key,Value>
范型類型
類型: 枚舉形入,類缝左, 結(jié)構(gòu)體,元組
類型 定義的時(shí)候崩掘,使用范型苞慢, 表示挽放,它的屬性成員,函數(shù)成員腿倚, 中定義的類型敷燎, 不是特定的焕襟,而是可以通過(guò)實(shí)參來(lái)指定
擴(kuò)展范型類型
擴(kuò)展一個(gè)范型類型時(shí)鸵赖, 原始類型中聲明的范型類型占位符饵骨,在擴(kuò)展中可以使用這些類型占位符宏悦。不需要重新定義
類型約束
正是由于榨为,類型不是固定的钦铺,可以隨便指定的佃牛。 實(shí)際中, 我們并不要求是任意的所有類型斋扰,
而是要求類型传货,有一定的限制。
什么限制粮宛? 要求類型符合: 某協(xié)議巍杈,某協(xié)議組合秉氧, 繼承自某父類
這是類型限制汁咏,
還有 : 取值的大小有一定的范圍
怎么表示約束呢?
范型函數(shù) 約束 表示方法:
用分號(hào):
范型類型 約束表示方法:
用分號(hào):
關(guān)聯(lián)類型
協(xié)議中的屬性纸泡、方法蚤假, 可以使用范型類型磷仰,
不需要協(xié)議名后面加尖括號(hào)范型, 而是在協(xié)議的定義中
用關(guān)鍵字:associatedtype 范型類型占位符 的一條語(yǔ)句來(lái)實(shí)現(xiàn)逢享。
如果某個(gè)瞒爬, 結(jié)構(gòu)體,類俊犯,枚舉, 定義為需要實(shí)現(xiàn)該協(xié)議绢彤。
可以在類型的定義中茫舶,typealias指定 協(xié)議中的associatedtype關(guān)聯(lián)類型指定實(shí)際的類型的名稱
擴(kuò)展:讓一個(gè) 已經(jīng)存在的類型 符合某個(gè)協(xié)議
extentesion Array: MyCoustomSomeeeeProtocol {}
protocol MyCoustomSomeeeeProtocol {
func printHllo()
}
where子句
func afaf<T:sommetype, Q:asdfasType
where T.asdf == Q.asdf,
T.asdfasdf:HelloClass
(aaa:T, bbb:Q) -> (T, Q) {
}
函數(shù)
閉包
閉包:傳入一個(gè)閉包讥耗。
閉包實(shí)現(xiàn)體中,閉包接受者挣磨、傳遞閉包者
1茁裙, 讀取這個(gè)參數(shù)。 閉包接受者查近,把創(chuàng)建好的參數(shù)傳入閉包,給閉包讀去使用
使用場(chǎng)景是: alamofire 的閉包, uploadTaskWithRequest的閉包
通常這個(gè)參數(shù)是struct類型
2戈泼, 修改這個(gè)參數(shù)大猛。 傳遞閉包者, 把從接受者那里拿到的參數(shù)唉堪, 通過(guò)一定的濾斗行為唠亚, 修改這個(gè)值。 接受者前酿,后面會(huì)從新拿回被傳遞者處理過(guò)的參數(shù)。
使用場(chǎng)景是:snapkit剿涮、sqlite.swift
通常這個(gè)參數(shù)是class類型
閉包表達(dá)式
尾隨閉包
值捕獲
閉包是引用類型
非逃逸閉包
自動(dòng)閉包
//do-catch
//try?
//try!
//do-catch 模式
do {
let a = try tryGetString(false)
print(a)
} catch let a {
let a = a as! MyError
switch a {
case .ErrorGet(let block):
block("Hello")
default:
logFlag()
}
}
do {
let a = try tryGetString(true)
print(a)
} catch {
let error = error as! MyError
switch error {
case .ErrorNetWork(let code, let reson):
print(code, reson)
default:
print("asd")
}
}
if let b = try? tryGetString(true) {
print(b)
}
logFlag()
//let _ = try! tryGetString(true)
logFlag()
func tryGetString(let test:Bool) throws -> String {
//寫(xiě)在可能拋出異常的語(yǔ)句前面取试,defer才可能被執(zhí)行。
defer {
logFlag()
}
if test {
throw MyError.ErrorNetWork(code: "404", reson: "asdf")
} else {
throw MyError.ErrorGet(block: { (a:String) in
print(a)
})
}
defer {
logFlag()
}
defer {
logFlag()
}
defer {
logFlag()
}
return "s"
}
func tryGetStringGo() throws {
try tryGetString(true)
}
let seprator:String = "================="
func logFlag(let file:String = #file , let line: Int = #line, let funcname:String = #function) {
print(file, line, funcname, separator: seprator, terminator: "************")
}
try
錯(cuò)誤處理
表示、 拋出錯(cuò)誤
表示錯(cuò)誤:ErrorType
throw 跟 return一樣 不涉及解除調(diào)用棧
func getSmting()throw{
if a {
return “ok”
} else {
//throw 立即退出方法
throw a:ErrorType
}
}
處理錯(cuò)誤
try萨赁?
try杖爽!
try : 必須處理這個(gè)錯(cuò)誤
1,傳遞給調(diào)用這個(gè)try的函數(shù):繼續(xù)傳遞
func getAd()throws{
if let a = try getSmting() {
}
}
2,用do化焕,catch
do {
try let a = getAd()
if a ! = nil {
}
} catch {
error
}
do {
try 表達(dá)式
語(yǔ)句
} catch{
error常量
}
do{
try 表達(dá)式
//如果沒(méi)有拋出錯(cuò)誤,下面的語(yǔ)句執(zhí)行元莫,否則轉(zhuǎn)移到catch子句
語(yǔ)句
} catch 模式 {
} catch 模式2 where 條件 {
} catch {
}
3,將錯(cuò)誤做為可選類型處理
let a:String?
a = getSmting()
if a {}
try?
4,斷言此錯(cuò)誤不會(huì)發(fā)生
有時(shí)候你知道throwing函數(shù)是不會(huì)拋出錯(cuò)誤的
這種情況下茎截,可以在表達(dá)式前面 寫(xiě)try榆浓!來(lái)禁用錯(cuò)誤傳遞
這會(huì)把調(diào)用包裝在一個(gè)有錯(cuò)誤拋出的運(yùn)行時(shí)斷言中。
如果真的拋出錯(cuò)誤萍鲸,你會(huì)得到一個(gè)運(yùn)行時(shí)錯(cuò)誤
禁用錯(cuò)誤傳遞
try!
指定清理操作
使用defer語(yǔ)句脊阴,在即將離開(kāi)當(dāng)前代碼塊執(zhí)行的語(yǔ)句
該語(yǔ)句可以執(zhí)行清理工作
不論是因?yàn)閞eturn離開(kāi)、break離開(kāi)秽五、throw離開(kāi),
都可以執(zhí)行defer中的語(yǔ)句
延遲到當(dāng)前的作用域退出之前瓣铣,這個(gè)語(yǔ)句的要求是
不能包含任何控制轉(zhuǎn)移語(yǔ)句。比如break蓖救、return循捺、throw
擴(kuò)展語(yǔ)法
類,結(jié)構(gòu)體叉谜,枚舉停局,協(xié)議
如果寫(xiě)了擴(kuò)展,則改類型 所有實(shí)例都可以用裆泳, 不管擴(kuò)展的代碼 寫(xiě)在 類型聲明前面還是后面
屬性, 類型屬性: 只能是計(jì)算型的
不可以添加存儲(chǔ)型。 不可以為已有屬性添加觀察器
類型屬性癣丧、 類型方法 都不能被重寫(xiě)胁编。 所以只能用static, 不管是struct市框,還是class,enum的類型屬性粪滤、類型方法
struct aa {
class func aa(){}//errr:只能用static
}
struct aa{
class
}
類類型 的 存儲(chǔ)屬性不能 用class關(guān)鍵字, 因?yàn)閏lass 關(guān)鍵字表示屬性可以被重寫(xiě)窍侧, 然而類類型的存儲(chǔ)屬性 無(wú)論如何不能被重寫(xiě)硼啤, 所以要用static
類類型 可以用 static存儲(chǔ)型屬性 谴返, 可以用計(jì)算型屬性。
但是存儲(chǔ)屬性 不能被子類重寫(xiě)渠抹。所以存儲(chǔ)屬性要用static
實(shí)例方法、類型方法: static: 添加新的功能放航,不能重寫(xiě)已有的功能
可變實(shí)例方法:
mutating
extension Int{
mutating func square(){
self=self*self
}
}
定義下標(biāo):
定義和使用新的嵌套類型:
使用一個(gè)已有類型 符合 某個(gè)協(xié)議:
構(gòu)造器
提供新的構(gòu)造器:
為類添加 便利構(gòu)造器
不能添加 新的指定構(gòu)造器, 指定構(gòu)造器和析gou qi
逐一成員構(gòu)造器赊时、指定構(gòu)造器、默認(rèn)構(gòu)造器狈涮、便利構(gòu)造器
構(gòu)造器規(guī)則- 讓所有成員完全初始化
方法
下標(biāo)
嵌套類型
協(xié)議
類、結(jié)構(gòu)體松却、枚舉 符合 協(xié)議
協(xié)議語(yǔ)法
類歌焦、結(jié)構(gòu)體、枚舉 定義非常相似
父類放在前面纷铣, 協(xié)議放在后面
屬性要求
聲明屬性 可讀寫(xiě)
類型屬性、類型方法啄踊, 用 static關(guān)鍵字
計(jì)算型见转、 存儲(chǔ)型吏砂、 觀察器狐血、 下標(biāo),
常量計(jì)算型(沒(méi)有常量計(jì)算型缀匕,因?yàn)橛?jì)算型的值都是不確定,要加var满钟, 計(jì)算型變量都是var的)夭织、
變量計(jì)算型(只要是計(jì)算型, 都加var)择浊、
只讀計(jì)算型(get)
常量存儲(chǔ)型
變量存儲(chǔ)型
只讀存儲(chǔ)型(就是常量存儲(chǔ)型)
結(jié)論: 協(xié)議總是用var來(lái)聲明 屬性。 類型后面加上{get set}可讀可寫(xiě)担孔,{get}可讀
沒(méi)有計(jì)算型常量:計(jì)算型變量只實(shí)現(xiàn)get方法
存儲(chǔ)型變量、存儲(chǔ)型常量拌消、計(jì)算型變量
存儲(chǔ)型常量=》計(jì)算型變量,實(shí)現(xiàn)get方法的計(jì)算型變量代替
屬性要求鹦筹,存儲(chǔ)型,計(jì)算型遍蟋。 無(wú)法獲知。采納協(xié)議時(shí)挟憔,可以定義為存儲(chǔ)型變量 或者 計(jì)算型變量
協(xié)議 類型屬性
協(xié)議中定義類型屬性政恍, 總是 使用 static關(guān)鍵字做為前綴,
類類型采納協(xié)議時(shí)宗弯,可以使用class關(guān)鍵字來(lái)聲明類型屬性。
方法要求
協(xié)議中定義類方法邓厕, 總是 使用static關(guān)鍵字做為前綴,類類型采納協(xié)議時(shí)昧互,可以使用class關(guān)鍵字來(lái)做為前綴
類:
類型屬性:
static , class
存儲(chǔ)變量屿储,存儲(chǔ)型常量民褂, 計(jì)算型變量
類型方法:
static, class
存儲(chǔ)變量,存儲(chǔ)型常量哭廉, 計(jì)算型變量
實(shí)例屬性:
存儲(chǔ)變量辽幌,存儲(chǔ)型常量, 計(jì)算型變量
實(shí)例方法:
mutating方法要求 變異方法
在實(shí)例方法中修改值加酵, 在結(jié)構(gòu)體,枚舉中码撰,將mutating關(guān)鍵字做為方法的前綴, 寫(xiě)在func關(guān)鍵字前,表示該方法 可以修改 任意屬性的值
構(gòu)造器要求
init
協(xié)議做為類型
做為函數(shù)绍在、方法、構(gòu)造器中的參數(shù)類型 或 返回值類型
做為常量溜宽、變量、屬性的類型
做為數(shù)組嫉嘀、字典、其他容器中的元素類型
協(xié)議也是一種類型瓣俯。 協(xié)議類型的名稱 應(yīng)與 其他類型 的寫(xiě)法相同, 使用駝峰式寫(xiě)法
委托模式
通過(guò) 擴(kuò)展 添加協(xié)議一致性
這里說(shuō)的不是 擴(kuò)展協(xié)議桶蝎。
擴(kuò)展協(xié)議,可以提供默認(rèn)的實(shí)現(xiàn):必須提供
也可以不提供默認(rèn)的實(shí)現(xiàn)胜茧? 不可以
某個(gè)類,本來(lái)沒(méi)有聲明為符合某個(gè)協(xié)議廊遍,
然而,這個(gè)類卵迂,把它進(jìn)行擴(kuò)展, 在擴(kuò)展中,聲明為符合某個(gè)協(xié)議,
與這個(gè)類墨闲,直接聲明為符合某個(gè)協(xié)議
作用是相同的盾鳞。
擴(kuò)展協(xié)議:擴(kuò)展 方法套利、下標(biāo)、屬性验辞、構(gòu)造器
原來(lái)的協(xié)議
通過(guò) 擴(kuò)展 采納協(xié)議
protocol TextRepresentable {
var texualDescription:String
}
struct Hamster {
var name:String
//實(shí)現(xiàn)了協(xié)議要求的方法跌造,卻沒(méi)有聲明采納協(xié)議
var texualDescription:String {
return “asdfasdf”
}
}
//空擴(kuò)展體 來(lái)采納協(xié)議
extension TextRepresentable {}
協(xié)議類型 的集合
協(xié)議的繼承
協(xié)議可以繼承其他的協(xié)議
就跟類一樣寝杖,一個(gè)類可以繼承其他的類
一個(gè)類醉拓,可以采納其他的協(xié)議
類類型 專屬 協(xié)議
protocol SomeClassOnlyProtocol : class, SomeInhreieitProtocol {
//這里是類類型 專屬協(xié)議的定義部分
}
只能讓類 來(lái)采納 該協(xié)議鹿霸, 結(jié)構(gòu)體钻哩, 枚舉 不能采納該協(xié)議
協(xié)議合成
let adfa: protocol<somapra, anotherpro>
局部作用域有效的睦袖,臨時(shí)的協(xié)議
協(xié)議合成厉亏, 協(xié)議繼承 ?
函數(shù)傳遞過(guò)程的可選解包
可選類型 就是 類型后面加? , 或者招刹!
參數(shù)為 一個(gè) 可選類型蔗喂,或者一個(gè)語(yǔ)句塊中定義的一個(gè)變量為 可選類型畦粮。
加!乖阵,使用變量時(shí) 會(huì)強(qiáng)制解包, 如果為nil則運(yùn)行時(shí)錯(cuò)誤钩蚊。
如果不加?,! ,這個(gè)參數(shù)或變量蝠咆,不能nil刚操,沒(méi)有初始化的值不能賦值
除非是定義為可選
所以,swift的好處是 如果一個(gè)函數(shù)占卧, 或者閉包豁遭, 參數(shù)類型后面沒(méi)有?,!不是可選的捂蕴, 那么這個(gè)
參數(shù)是一定不會(huì)為nil的啥辨。因此可以放心使用
條件綁定一定要是對(duì)可選變量進(jìn)行解包
把一個(gè)可選類型 -》 類型: 解包
可選類型 -》 可選類型: 不會(huì)觸發(fā)解包
檢查 協(xié)議一致性
is: 是否符合協(xié)議
as腕够? 符合時(shí),返回實(shí)例, 否則返回nil
as 沸手! 符合時(shí)返回實(shí)例菲语, 失敗時(shí)妄帘,crash
as? , as! 強(qiáng)制轉(zhuǎn)換以后 割择,綁定到實(shí)例時(shí)昧港,
那個(gè)實(shí)例, 僅僅是 符合 協(xié)議類型的實(shí)例, 其他的屬性不可以被訪問(wèn)和打印
可選的 協(xié)議要求
整個(gè)函數(shù)類型是可選的飘哨, 不是函數(shù)的返回值可選
可選的協(xié)議要求 只能用在標(biāo)記了@objc的協(xié)議中
@objc protocol CoutnaerDataSource {
optional func adsfa(coutn:Int)->Int
optional var fixedIncrement:Int {get}
}
協(xié)議擴(kuò)展
提供默認(rèn)實(shí)現(xiàn)
協(xié)議本身來(lái)實(shí)現(xiàn)功能鸿吆。 協(xié)議 ,不是 一堆的 方法策泣、屬性、下標(biāo)愉烙、構(gòu)造 后面沒(méi)有賦值调限,也沒(méi)有花括號(hào)嗎?
協(xié)議本身來(lái)實(shí)現(xiàn) 方法、屬性贞远、 下標(biāo)、構(gòu)造
protocol RandmNumberGenerator {
func rundom()->Float
}
extension RandomNumberGenerator {
func randomBool()->Bool {
return random() > 0.5
}
}
通過(guò)協(xié)議擴(kuò)展, 所有采納協(xié)議的類型, , 都能獲得這個(gè)擴(kuò)展所增加的方法實(shí)現(xiàn)。
如果 擴(kuò)展的協(xié)議晚伙, 被某一個(gè)類所采納, 這個(gè)類塞栅,自己實(shí)現(xiàn)了 擴(kuò)展中的協(xié)議要求者铜,
那么,它自己實(shí)現(xiàn)的放椰, 將會(huì)替代擴(kuò)展中的 默認(rèn)實(shí)現(xiàn)
協(xié)議擴(kuò)展 提供了默認(rèn)的實(shí)現(xiàn)作烟, 采納了這種協(xié)議的類, 因?yàn)橛辛四J(rèn)的實(shí)現(xiàn)砾医, 但是它卻是又 聲明了拿撩,需要實(shí)現(xiàn)協(xié)議的要求, 然后協(xié)議所要求的 屬性藻烤、 方法绷雏、 下標(biāo) 都在默認(rèn)中被實(shí)現(xiàn)了,
因此 怖亭, 這些要求 涎显, 可以不需要類 去實(shí)現(xiàn)。 和 可選的協(xié)議一樣:
有要求兴猩, 但是可以實(shí)現(xiàn)要求期吓, 可以不實(shí)現(xiàn)要求,
那么區(qū)別是? 提供默認(rèn)實(shí)現(xiàn)的協(xié)議擴(kuò)展要求讨勤,和協(xié)議中聲明的可選要求 箭跳,有什么區(qū)別?
optional聲明的要求:可選鏈?zhǔn)秸{(diào)用
在擴(kuò)展中默認(rèn)實(shí)現(xiàn)的要求:直接調(diào)用
為協(xié)議擴(kuò)展添加限制條件
//where子句
extension CollectionType
where Cdfadf.element:
TextaereTalbe
{
var asdfDesrpt:String {
}
}
擴(kuò)展collectiontype協(xié)議潭千, 只適用于
集合中的元素采納了textrepresentable協(xié)議的情況
where Generator.Element: TextRepresentable
把邏輯 和 行為 分開(kāi)--》協(xié)議
值類型
String谱姓,Array和Dictionary類型均以結(jié)構(gòu)體的形式實(shí)現(xiàn)。這意味著被賦值給新的常量或變量刨晴,或者被傳入函數(shù)或方法中時(shí)屉来,它們的值會(huì)被拷貝。
NSString狈癞,NSArray和NSDictionary類型均以類的形式實(shí)現(xiàn)茄靠,而并非結(jié)構(gòu)體。它們?cè)诒毁x值或者被傳入函數(shù)或方法時(shí)蝶桶,不會(huì)發(fā)生值拷貝慨绳,而是傳遞現(xiàn)有實(shí)例的引用。
閉包是引用類型
方法命名
at, in, on, during, for
over,above,below,before,after,
with, through,except, but
as for, according to along with, ashore
since,util,
“等價(jià)于”表示兩個(gè)類類型(class type)的常量或者變量引用同一個(gè)類實(shí)例真竖。
恒等
//用值類型
“等于”表示兩個(gè)實(shí)例的值“相等”或“相同”脐雪,判定時(shí)要遵照設(shè)計(jì)者定義的評(píng)判標(biāo)準(zhǔn),因此相對(duì)于“相等”來(lái)說(shuō)疼邀,這是一種更加合適的叫法喂江。
用struct,enum旁振,tuple,string涨岁,array拐袜,dictionary
1,要用==運(yùn)算符來(lái)比較實(shí)例的 數(shù)據(jù) 時(shí)
2梢薪,兩個(gè)實(shí)例的拷貝 能 保持 獨(dú)立的狀態(tài) 時(shí)
3蹬铺,數(shù)據(jù)被多個(gè)線程 使用 時(shí)
可以在線程之間安全的傳遞變量,而不需要特地去同步秉撇,不需要花功夫來(lái)防范其他代碼在暗地里修改它們
用class
1甜攀,共享的 可變對(duì)象時(shí)
2,==來(lái)比較實(shí)例 身份的 時(shí)
參數(shù)名和類型琐馆,外部名稱规阀,內(nèi)部名稱
有意在初始化時(shí)設(shè)置為空的
override 重寫(xiě)構(gòu)造器
override
required子類必須實(shí)現(xiàn)該構(gòu)造器
父類的必要的 構(gòu)造器 , 可以不需要添加override修飾符
屬性
存儲(chǔ)型屬性:
常量結(jié)構(gòu)體的存儲(chǔ)型屬性:無(wú)法修改該實(shí)例的任何屬性
延遲存儲(chǔ)屬性
lazy:
1瘦麸、實(shí)例的構(gòu)造過(guò)程結(jié)束后谁撼,才會(huì)知道影響值的外部因素時(shí),可以使用lazy
2滋饲、獲得屬性的初始值需要復(fù)雜 或 大量 計(jì)算時(shí)厉碟, 可以只在需要的時(shí)候計(jì)算它喊巍。
計(jì)算型屬性
只讀計(jì)算屬性:只有g(shù)etter,沒(méi)有setter
必須使用var關(guān)鍵字定義計(jì)算屬性箍鼓。 包括只讀計(jì)算屬性崭参。
因?yàn)樗麄兊闹挡皇枪潭ǖ摹et用來(lái)聲明常量款咖,表示初始化后何暮,再也無(wú)法修改的值。
全局變量
在函數(shù)之剧、方法郭卫、閉包 或 任何類型之外定義的變量
局部變量
在函數(shù),方法背稼,閉包內(nèi)部定義的變量
類型屬性
計(jì)算型類型屬性贰军,
static var adf:String{
get{return “asdf”}
set(value){afsdfa = value}
}
存儲(chǔ)型類型屬性,
staic var sdfChannles:Int = 10
只讀計(jì)算型類型屬性蟹肘,
static var adf:String{
get{return “asdf”}
}
只讀存儲(chǔ)型類型屬性:
static let asdf = 1
計(jì)算型词疼、
存儲(chǔ)型、
延遲存儲(chǔ)屬性帘腹、 不需要加lazy贰盗,它本身就是延遲初始化的,
什么是延遲: 在被訪問(wèn)的時(shí)候阳欲,才會(huì)初始化舵盈。即使是多個(gè)線程同時(shí)訪問(wèn),
系統(tǒng)也保證對(duì)其進(jìn)行一次初始化
如果是局部變量球化,局部的存儲(chǔ)型屬性秽晚,加了lazy,延遲存儲(chǔ)屬性筒愚,沒(méi)有被初始化時(shí)就同時(shí)被多個(gè)線程訪問(wèn)赴蝇,則無(wú)法保證該屬性只會(huì)被初始化一次
觀察器、
lazy延遲存儲(chǔ)屬性
計(jì)算屬性本身就是延遲屬性
可以為 存儲(chǔ)屬性 添加屬性觀察器巢掺,設(shè)置默認(rèn)值時(shí)不會(huì)被觸發(fā)句伶。
不需要為 延遲存儲(chǔ)屬性添加觀察器,不需要為 計(jì)算型屬性添加觀察器陆淀。
但是 如果 是繼承過(guò)來(lái)的包括存儲(chǔ)型 和 計(jì)算型考余, 可以添加觀察器
默認(rèn)值、
賦值語(yǔ)句
構(gòu)造器
便利構(gòu)造器
可失敗構(gòu)造器
繼承
定義一個(gè)基類
子類生成
重寫(xiě)
實(shí)例方法倔约、 類方法 都可以重寫(xiě)
如果不寫(xiě)override秃殉,編譯將會(huì)不通過(guò),報(bào)錯(cuò)
凡是重寫(xiě)的屬性, 都可以提供getter钾军,setter鳄袍,或者添加willset/didset觀察器
計(jì)算型必須是var,只讀計(jì)算型吏恭,是只提供getter
存儲(chǔ)型可以是let拗小,var,只讀存儲(chǔ)型樱哼,是加let
加let的存儲(chǔ)型屬性哀九, 子類繼承它時(shí),重寫(xiě)let的只讀存儲(chǔ)型屬性搅幅,提供getter阅束,setter
只要提供getter,setter茄唐,屬性就不能加let關(guān)鍵字息裸,也就是說(shuō) 父類只讀的let 存儲(chǔ)型的屬性,重寫(xiě)時(shí)沪编,不能提供getter呼盆,setter
重寫(xiě)getter,setter蚁廓, 一般是對(duì)父類的var 存儲(chǔ)型屬性访圃、 計(jì)算型屬性 進(jìn)行重寫(xiě)
防止重寫(xiě)
final
存儲(chǔ)型屬性的 初始化
存儲(chǔ)型屬性的值不能處于一個(gè)未知的狀態(tài)
自定義構(gòu)造過(guò)程
構(gòu)造參數(shù)、
可選屬性: 在初始化的時(shí)后設(shè)置為空
常量屬性相嵌,構(gòu)造時(shí)腿时,指定一個(gè)值. 一旦常量屬性被賦值, 它將永遠(yuǎn)不可更改
常量屬性饭宾,只能在 定義它的類的構(gòu)造過(guò)程中修改圈匆, 不能在子類的 構(gòu)造過(guò)程中修改
默認(rèn)構(gòu)造器
沒(méi)有父類、所有屬性都有默認(rèn)值捏雌, 自動(dòng)生成一個(gè)構(gòu)造器
值類型的構(gòu)造器代理
便利構(gòu)造器: 就是init里面可以調(diào)用init
類 類型 : 指定構(gòu)造器、 便利構(gòu)造器
類的繼承和構(gòu)造
兩段式構(gòu)造笆搓?
指定構(gòu)造器必須總是向上代理
便利構(gòu)造器必須總是橫向代理
可失敗構(gòu)造
init?()
return nil
init?(rawValue:){}
用一個(gè)非可失敗的構(gòu)造器 重寫(xiě)了父類的可失敗構(gòu)造器
感嘆號(hào)性湿! 問(wèn)好?
B堋:對(duì)應(yīng)類型的隱式解包可選類型
必要構(gòu)造
隱式解包可選類型
重寫(xiě)父類的必要構(gòu)造器時(shí)肤频, 不需要加override
閉包或函數(shù) 設(shè)置默認(rèn)值
用閉包為屬性提供默認(rèn)值。 沒(méi)有參數(shù)的閉包
{[weak self] (dfasdf:String, asdf:Int) in
asdfasdf = asdfasdf
return asdfasdf
}()
{[weak self] in
asdfasdf = asdfasdf
return asdfasdf
}()
{[weak self]
asdfasdf = asdfasdf
return asdfasdf
}()
表示立即執(zhí)行此閉包
不能在閉包里面訪問(wèn)其他屬性算墨。即使這些屬性有默認(rèn)值宵荒。 也不能使用self,
不能調(diào)用任何實(shí)例方法
!
required
用閉包為屬性提供默認(rèn)值 用 “ = ”
仍然是存儲(chǔ)型屬性
let add:String = {return “asdfasdf”}()
計(jì)算型屬性
let add:String {get {return “11”}
set(value) {
staff = value
}}
可失敗構(gòu)造器
init?(asdfa:String) {
if da.isEmpty() {return nil }
self.asdfasd = asdfa
}
一旦構(gòu)造失敗 , 就會(huì)觸發(fā)斷言
init!(adfa:String){
if adfa.isempty() {return nil}
self.asdf = adfa
}
構(gòu)建一個(gè)對(duì)應(yīng)類型的 隱式解包可選類型 的對(duì)象报咳。
? 可選鏈?zhǔn)秸{(diào)用 訪問(wèn) 可選字符串類型String?
自動(dòng)賦值為nil
用閉包 為屬性 提供默認(rèn)值
閉包的 返回值 賦值
閉包本身 的 賦值
任何缺少override關(guān)鍵字的重寫(xiě)都會(huì)在編譯時(shí)被診斷為錯(cuò)誤侠讯。
使用關(guān)鍵字 final 來(lái)禁用子類重寫(xiě)
final var
final func
final class func
final subscript
防止重寫(xiě)
class添加final,整個(gè)類 標(biāo)記 為final暑刃, 這樣的類不可以被繼承
你不可以將一個(gè)繼承來(lái)的讀寫(xiě)屬性重寫(xiě)為一個(gè)只讀屬性厢漩。
如果你在重寫(xiě)屬性中提供了 setter,那么你也一定要提供 getter岩臣。如果 不想寫(xiě)getter溜嗜, 可以再getter中 ,直接返回 super.someproperty
setter > getter
可選鏈?zhǔn)秸{(diào)用:在當(dāng)前值可能為nil的可選值上 請(qǐng)求和調(diào)用 屬性架谎、方法炸宵、下標(biāo)的方法。
如果可選值有值谷扣,調(diào)用成功土全;如果可選值是nil,那么調(diào)用 將返回nil抑钟。
多個(gè)調(diào)用連接在一起涯曲,形成一個(gè)調(diào)用鏈,如果其中任何一個(gè)節(jié)點(diǎn)為nil在塔,整個(gè)調(diào)用鏈都會(huì)失敗幻件,整個(gè)調(diào)用鏈返回nil
!:強(qiáng)制展開(kāi)蛔溃,如果失敗绰沥,就會(huì)crash
?:可選調(diào)用贺待,如果失敗徽曲,就會(huì)返回nil
使用?代替!
為可選鏈?zhǔn)秸{(diào)用 定義模型類
?訪問(wèn)屬性
?調(diào)用方法
?訪問(wèn)下標(biāo)
多層可選鏈?zhǔn)秸{(diào)用
在方法的可選 返回值 上進(jìn)行可選鏈?zhǔn)秸{(diào)用
js.residence?.address = “asdfa”
可選鏈?zhǔn)秸{(diào)用失敗時(shí),等號(hào)右側(cè)的代碼不會(huì)被執(zhí)行
johoo.residence?[0]
弱引用麸塞,或無(wú)主引用秃臣,以替代強(qiáng)引用,從而解決循環(huán)強(qiáng)引用的問(wèn)題
var dictionary = [“dave”:[2,3123,4], “bev”:[123,3,45,1]]
dictionary[“dave”]?[0] = 123
dictionary[“bev”]?[2] = 12
dictionary[“adsfafds”]?[2] = 123
在方法的圓括號(hào)后面加上?
if let beginWithThe = joho.residence?.address?.buildingIndetifer()?.hasPrefix(“”) {
if begintWithThe {
} else {
}
}
在方法的返回值上 進(jìn)行 可選鏈?zhǔn)秸{(diào)用哪工, 而不是方法本身
1奥此,弱引用, a,b 都是?可選的
一個(gè)人不總是有房子,一個(gè)房子不總是有人住在里面
2雁比,無(wú)主引用稚虎, a必須有b,b不一定有a
一個(gè)人可能有偎捎、或者沒(méi)有信用卡蠢终, 但是一張信用卡總是關(guān)聯(lián)著一個(gè)客戶
3序攘,隱式解析類型, 無(wú)主引用: a,b寻拂,都不能為nil
每個(gè)國(guó)家必須有首都程奠,每個(gè)城市必須屬于一個(gè)國(guó)家
隱式解析可選類型的屬性 在類型結(jié)尾處 加上感嘆號(hào)City!的方式,將country的capitalCity屬性聲明為隱式解析可選類型的屬性兜喻。 capitalcity屬性的默認(rèn)值為nil梦染,但是不需要展開(kāi)它的值就能訪問(wèn)它
Person和Apartment的例子展示了兩個(gè)屬性的值都允許為nil,并會(huì)潛在的產(chǎn)生循環(huán)強(qiáng)引用朴皆。這種場(chǎng)景最適合用弱引用來(lái)解決帕识。
Customer和CreditCard的例子展示了一個(gè)屬性的值允許為nil,而另一個(gè)屬性的值不允許為nil遂铡,這也可能會(huì)產(chǎn)生循環(huán)強(qiáng)引用肮疗。這種場(chǎng)景最適合通過(guò)無(wú)主引用來(lái)解決。
然而扒接,存在著第三種場(chǎng)景伪货,在這種場(chǎng)景中,兩個(gè)屬性都必須有值钾怔,并且初始化完成后永遠(yuǎn)不會(huì)為nil碱呼。在這種場(chǎng)景中,需要一個(gè)類使用無(wú)主屬性宗侦,而另外一個(gè)類使用隱式解析可選屬性愚臀。
閉包引起的循環(huán)強(qiáng)引用問(wèn)題,
解決方法矾利,還是使用 weak姑裂, 或者 unowned
如果被捕獲的引用絕對(duì)不會(huì)變?yōu)閚il,應(yīng)該用無(wú)主引用男旗,而不是弱引用舶斧。
lazy屬性, 只有當(dāng)初始化完成 以及 self 確實(shí)存在后察皇,才能訪問(wèn)lazy屬性茴厉。 因此閉包中, 可以用self
閉包捕獲列表 [unowned self, weak deleate = self.delegate]
某一個(gè)對(duì)象持有閉包什荣, 閉包體里面 使用了這個(gè)對(duì)象self呀忧, 這樣互相持有,兩個(gè)對(duì)象就產(chǎn)生了循環(huán)強(qiáng)引用
lazy var jj:(Int,String) -> String = {
[unowned self, weak delegate = self.delegate!] (index:int, stringtoProcess: String) -> String in
閉包的函數(shù)體 語(yǔ)句
}
lazy var someClusre:Void -> String = {
[unowned self, weak delegate = self.delegate!] in
閉包的函數(shù)題語(yǔ)句
}
無(wú)主引用溃睹、
弱引用: 總是可選類型。 當(dāng)引用的實(shí)例被銷(xiāo)毀胰坟,弱引用的值會(huì)自動(dòng)為nil
無(wú)主引用:同時(shí)銷(xiāo)毀
當(dāng)引用計(jì)數(shù)為0時(shí)因篇,銷(xiāo)毀實(shí)例
創(chuàng)建實(shí)例的強(qiáng)引用泞辐。 強(qiáng): 它將實(shí)例牢牢保持住,只要強(qiáng)引用還在竞滓,實(shí)例是不允許被銷(xiāo)毀的
隱式解析
顯示解析咐吼?
函數(shù), 方法 商佑, 閉包 內(nèi)部定義的變量--局部變量
全局變量锯茄, 存儲(chǔ)型變量
延遲存儲(chǔ)屬性 lazy,
全局的變量 本來(lái)就是 延遲計(jì)算的茶没, 不需要加lazy
先寫(xiě) 父類名肌幽, 在寫(xiě) 協(xié)議名
protocol Fullynamed {
var fullName:String {get}
}
var a = Int
var a = Double
var a = [“1”, “2121”,”12312”]
begin . . . end
var shotpis = Int
shapes[1…3] = []
var letters = Set<Int>()
var letters:Set<String>
Array<Int>()
Int
Int,String,Int
Int:String,String:Int
枚舉:
關(guān)聯(lián)值
原始值
成員值
枚舉
枚舉值
原始值: 字符串, 字符抓半, 整型喂急, 浮點(diǎn)型
初始值
關(guān)聯(lián)值:
遞歸枚舉
1,關(guān)聯(lián)值 存儲(chǔ)在枚舉成員中笛求, 2廊移, 原始值 存儲(chǔ)在枚舉成員中,
==》 枚舉值
使用整數(shù)作為原始值探入, 隱式賦值狡孔, 依次遞增1
第一個(gè)枚舉成員, 原始值 為0
使用字符串做為枚舉類型的原始值時(shí)蜂嗽, 每個(gè)枚舉值成員的隱式原始值 為 該枚舉成員 的名稱
使用原始值 初始化 枚舉 實(shí)例
enum ad : Int{
case a, b, c , d
}
if let a = ad(rawValue:1)? {
switch a {
case .a:
case .b:
case .c:
case .d:
default:
} else {
}
oc枚舉苗膝,枚舉值只能是整型:int、unsigned int徒爹,long荚醒,long long、int32_t隆嗅、int64_t界阁、nsinteger
swift枚舉
1、是集合類型胖喳,值類型
2泡躯、枚舉成員,可以關(guān)聯(lián)任意類型:string丽焊、array较剃、int、dictionary技健、double啄巧、float,struct仪吧、class、元組偿短、函數(shù)類型、閉包類型
關(guān)聯(lián)值-在switch case分支中使用let或var前綴馋没,提取每個(gè)關(guān)聯(lián)值昔逗;如果一個(gè)枚舉成員的所有關(guān)聯(lián)值都被提取,可以把let放在成員名稱前面篷朵, 括號(hào)面的每一個(gè)關(guān)聯(lián)值省略let或者var
3勾怒、跟class一樣,有構(gòu)造方法声旺、析構(gòu)方法笔链,還可以遵循協(xié)議
4、用在switch分支語(yǔ)句中艾少,必須窮舉所有枚舉值
5卡乾、枚舉成員不會(huì)提供默認(rèn)值,本身就是完備的值:可以使用原始值填充成員
6、枚舉值可以遞歸: 某一個(gè)成員的關(guān)聯(lián)值類型是枚舉類型自身缚够,在這個(gè)成員類型的定義前面加上 indirect關(guān)鍵字
enum asdf{
case asdfa
case asdf2
case asdfasdf(fads:String,fadsf:int)
case asdfdf(dfad:String)
}
asdf.asdfa(“asdfas”,”asdfasdf”)
let asdff = asdf.asdfasdf(fads:“fads”,fadsf:”fsdfasdf”)
switch asdff {
dase .asdfa
case .asdf2
case .asdfasdf(let a, let b)
print (a)
print (b)
case .asdfdf(let c)
print (c)
}
元組
1幔妨,
git
//github
//gitlab
svn
try? hell()
try! hell()
throws寫(xiě)在箭頭前面
do catch
func fudd() throws -> String{
return
}
do {
//expression: 表達(dá)式
try expression
statements
} catch pattern 1 {
//匹配模式
statements
} catch pattern 2 where condition {
statements
}
將錯(cuò)誤轉(zhuǎn)換成可選值, try?expression時(shí)谍椅, 一個(gè)錯(cuò)誤被拋出,那么表達(dá)式的值就是nil.
下面x误堡,y 有著等價(jià)的含義
func sometthorwingFunction() throws->String {}
let x = try? sometthorwingFunction()
let y:String?
do {
y = try sometthorwingFunction()
} catch {
y = nil
}
func fetchData()->Data?{
if let data = try ? fetchDataFromDisk() {return data}
if let data = try ? fetchDataFromServer() {return data}
return nil
}
禁用錯(cuò)誤傳遞, 如果真的拋出了錯(cuò)誤雏吭, 則會(huì)在運(yùn)行時(shí)發(fā)生錯(cuò)誤
let photo = try!loadimge(“./asdfasdf/df.jpg”)
當(dāng)前作用域退出之前執(zhí)行
func processFile(fileName:String)throws {
if exists(filename) {
let file = open (filename)
defer {
close(file)
}
//try? 锁施,不需要catch。 返回nil杖们, try!不需要catch悉抵,運(yùn)行時(shí)錯(cuò)誤 try:立即拋出一個(gè)錯(cuò)誤
while let line = try file.readline() {
}
}
}
如果一個(gè)或者多個(gè)條件不成立,可用 guard 語(yǔ)句用來(lái)退出當(dāng)前作用域摘完。
guard語(yǔ)句格式
guard 條件 else {
//條件 可以使用可選綁定姥饰, 條件的結(jié)果必須符合booleantype協(xié)議
語(yǔ)句
guard綁定的值 guard語(yǔ)句后面可以使用
guard let a = asfOptional else {return}
print(a)//a可以使用
//必須有else子句,而且在子句中 標(biāo)記 noreturn特性的函數(shù)孝治,或者使用return, break, continue, throw
退出作用域
}
強(qiáng)制展開(kāi) 觸發(fā)運(yùn)行時(shí)錯(cuò)誤
可選 可選鏈?zhǔn)秸{(diào)用
可選的
強(qiáng)制的
可選鏈?zhǔn)秸{(diào)用失敗時(shí)列粪, 后面的 調(diào)用 不會(huì) 執(zhí)行
嵌套類型 加前綴 加上 外部類型的類型名作為前綴
可選鏈 , 強(qiáng)制展開(kāi)
?, !
?返回nil谈飒, 可選展開(kāi)
!如果是nil 岂座,則觸發(fā) 運(yùn)行時(shí) 錯(cuò)誤, 因?yàn)闆](méi)有展開(kāi)的值
都可以用數(shù)組字面量
1杭措、數(shù)組字面量 創(chuàng)建數(shù)組
[Int]
Array<Int>()
2费什、集合
[1,2,3,4] 可以是數(shù)組或者集合
3、字典
字典字面量 創(chuàng)建字典
[Int:String]
Dictionary<Int,String>()
[“a”:”adsf”,”asdf”:”1231”]
擴(kuò)展手素,
1吕喘, 類赘那, 結(jié)構(gòu)體, 枚舉氯质, 協(xié)議
添加新的功能
2,
計(jì)算型屬性祠斧、
計(jì)算型類屬性
實(shí)例方法闻察、 類方法
新的構(gòu)造器
定義 和使用 新的 嵌套類型
支持 新的 一個(gè) 或 多個(gè) 協(xié)議
mutating, 改變 實(shí)例
func dfasd(a:protocol<UITableViewDataSource, UITableViewDelegate>, b:String)
extension CollletctionType
數(shù)組的遍歷
索引值 和 數(shù)據(jù)值 組成的元組
元組 分解成 臨時(shí)常量 或者變量 來(lái)進(jìn)行遍歷
for (asdf,asdfd) in somearray.enumerate() {
}
1琢锋,閉包是引用類型
閉包 作為 參數(shù) 傳遞
閉包是在 函數(shù) 返回后 才被執(zhí)行
從函數(shù)中逃逸
@noescape,不允許逃逸
可以使用self
閉包的生命周期 就在 函數(shù)里面辕漂。
func adf(@noescape closure()->Void){
closure()//確保在add調(diào)用后就沒(méi)有用了
}
sort方法 傳遞 一個(gè)閉包參數(shù), 在排序結(jié)束之后就沒(méi)用了
escape允許逃逸出函數(shù)作用域
var a:[()->String] = []
func collectA(@autoclosure(escaping) pp:()->String){
//pp并沒(méi)有調(diào)用吴超, a在函數(shù)作用域范圍外钉嘹, 函數(shù)返回之后被調(diào)用,
允許逃逸出函數(shù)作用域
a.append(pp)
}
collectA(array.removeAtIndex(0))
collectA(array.removeAtIndex(0))
for aa in a {
aa()
}
2鲸阻,自動(dòng)閉包
自動(dòng)創(chuàng)建的閉包跋涣, 用一個(gè)普通的表達(dá)式 來(lái) 代替 顯示的閉包
statements 表達(dá)式 會(huì)被返回
這種閉包不接受任何參數(shù)、當(dāng)它被調(diào)用的時(shí)候鸟悴,會(huì)被返回被包裝在其中的表達(dá)式的值陈辱。
用普通的表達(dá)式 來(lái) 代替顯式的閉包,從而省略閉包的{}花括號(hào)
自動(dòng)閉包的好處就是節(jié)省內(nèi)存吧细诸?
fatalError(“1g bytes”)并沒(méi)有分配 1g的內(nèi)容存儲(chǔ)沛贪。其實(shí)就存儲(chǔ)了一個(gè)閉包使用的時(shí)候才會(huì)被調(diào)用
a(“dfadf”)
等價(jià)于
a( void -> void in { return adfadf } )
顯示的閉包{(params) -> returnType in statements}
in可以省略
返回類型可以省略、參數(shù)名稱可以省略(使用縮寫(xiě))震贵、直接用一個(gè)運(yùn)算符利赋、
尾隨閉包 可以省略小括號(hào)、
let add = {array.removeAtIndex(0)}
這個(gè)閉包 并沒(méi)有執(zhí)行
只有當(dāng)調(diào)用 add()才會(huì)執(zhí)行
延時(shí)求值
@autoclosure
() -> String
{ somefunc(asdfa) }
fatalError(@autoclosure message:()->String){}
fatalError(“HEllooooo”)
fatalError({ (Void) -> Void in “hellowoooo”})
{
(params) -> returnType in
statements
}
閉包猩系, 根據(jù)上下文推斷類型媚送,({s1, s2 in s1 > s2})
參數(shù)重 使用參數(shù)名的縮寫(xiě), 則參數(shù)可以省略蝙眶, 返回類型可以省略季希, 直接寫(xiě)函數(shù)體names.sort({$0 > $1})
使用運(yùn)算符函數(shù) names.sort(>)
尾隨閉包
閉包可以在被定義的上下文中, 捕獲常量 或 變量
func makeIncremeter(amount:Int) -> () -> Int {
var runingttoal = 0
func incremter() -> Int {
runingttoal += amount
return runingttoal
}
return incremter
}
let a = makeIncremeter(4)
let b = makeIncremter(12)
a()
b() //12
let c = b
c() //24 函數(shù) 和 閉包 都是引用類型幽纷。
一個(gè)沒(méi)有參數(shù)式塌,并且返回值為string的函數(shù)()->String{}
let a = {
print(“adsfadsfa”)
}
//并不會(huì)打印adsfadsfa
a()
這時(shí)候打印
var cutomersInline = [“asdf”,”asdfasfd”,”asd”]
func saveCustomer(customerProvider:()->String){
customerProvider()
}
saveCustomer({customersInline.removeAtIndex(0)})
func saveCustomer(@autoclosure customerProvider:()->String){
customerProvider()
}
//自動(dòng)轉(zhuǎn)化為一個(gè)閉包
saveCustomer(customerInline.removeAtIndex(0))
3,@autoclosure(escaping)
{
(s1:String,s2:String) -> String in
return “asdfa”
}
閉包的寫(xiě)法:
1,上下文 推斷 類型
{s1, s2 -> Int in return 1 }
2友浸,單表達(dá)式隱式閉包峰尝, 省略return關(guān)鍵字
{s1, s2 in s1 > s2}
3,參數(shù)名稱 也可以縮寫(xiě)
{$0 > $1}
4收恢,>,省略了參數(shù)武学, 省略了返回值祭往, 省略了return,大括號(hào)也省略了
names.sort(>)
5,{(a:String,and:Int) -> Void in print(“asdfa”)}
6火窒,{[unowned self] (a:String,and:Int) -> Void in print(“afasdfasdfa:(self.name)”)}
尾隨閉包硼补,
函數(shù)的最后一個(gè)參數(shù) 是 閉包類型。
調(diào)用這個(gè)函數(shù)
func somefun(cll:()->Void){}
func somefun(cll:()->()){}
somefun(){}
somefun({})
somefun{}
func somefunc(s:String, ff:()->Void){}
somefunc(s:”asdfa”,{})
somefunc(s:”asdf”){}
func hell(add:String…) -> String{
}
參數(shù)是一個(gè)元組熏矿, 返回值 也是 一個(gè)元組
0個(gè) 或 多個(gè)
func hell(ads:String…) -> (asdf:String,adds:Int) {
for aasdf in ads {
}
}
一個(gè)函數(shù) 最多 只能有一個(gè) 可變參數(shù)
閉包做函數(shù)的參數(shù)
函數(shù)做函數(shù)的參數(shù)
閉包捕獲列表
lazy var asdf:Void->String = {
self.name
}
lazy var asdf:Void->String = {
[unowned self, weak delegate = self.delegate!] in
這里是閉包函數(shù)題
}
func asHtml()->String{
}
a.asdf()
a.ashtml()
swift的權(quán)限控制 與 繼承 無(wú)關(guān)已骇, 是單緯度的。
因?yàn)?swift的主要需求是:將一個(gè)類票编、 框架 的實(shí)現(xiàn)細(xì)節(jié) 隔離保護(hù)起來(lái)褪储。
1,objc的擴(kuò)展和swift的擴(kuò)展慧域?
擴(kuò)展: 為一個(gè)已有的類鲤竹、 結(jié)構(gòu)體、 枚舉昔榴、 協(xié)議 添加新功能
swift的擴(kuò)展沒(méi)有名字
使用static 來(lái)定義類型屬性辛藻。
存儲(chǔ)型屬性 不能 作為類方法, 不能用static论泛, class
存儲(chǔ)型類屬性揩尸, 用static, 子類不能重寫(xiě)
計(jì)算型類屬性, 用static不能重寫(xiě)屁奏, 用class可以重寫(xiě)
為類 定義 計(jì)算型 的類型屬性岩榆, 可以改用關(guān)鍵字 class 來(lái)支持 子類對(duì)父類 的實(shí)現(xiàn) 進(jìn)行重寫(xiě)。
計(jì)算型類型屬性
static var add:Int {return 1}
static var ad:String = “123123”
class var add:Int {return 1}
AddClass.add = 1213
AddClass.ad = 123123
實(shí)例方法坟瓢、 類方法
class func asdfa(){}
構(gòu)造器
下標(biāo)
可變實(shí)例方法
給self賦值
定義和使用 新的嵌套類型
擴(kuò)展 符合 某個(gè)協(xié)議
2勇边,擴(kuò)展 和 繼承 、擴(kuò)展 折联?
擴(kuò)展 可以為一個(gè)類型添加新的功能粒褒, 但是不能重寫(xiě)已有的功能
擴(kuò)展 不能 重寫(xiě) 已有的功能
協(xié)議
方法、 屬性诚镰、下標(biāo)
類奕坟、結(jié)構(gòu)體、枚舉 都可以采納協(xié)議
[]
[AnyObject]
1清笨、一個(gè)任意類型對(duì)象的數(shù)組
2月杉、任意類 類型
3、類抠艾,枚舉苛萎,結(jié)構(gòu)體,函數(shù),閉包
Any 函數(shù)類型腌歉, 非類類型
is 檢查類型
as 轉(zhuǎn)換類型
檢查 一個(gè) 類型 是否實(shí)現(xiàn)了 某個(gè)協(xié)議
@objc
標(biāo)記 @objc特性 的協(xié)議 蛙酪, 只能 被 繼承子 objc 類的子類
其它的類、結(jié)構(gòu)體翘盖、枚舉 不能采納這種協(xié)議
switch表達(dá)式的case中 使用 is 和 as 操作符
Any 或 AnyObject
空的元組:()桂塞, Void
func adfMean(asdf:Double…)->Double {
}
func ad(ads:Int…) -> (a:String,b:String)? {
for str in ads {
}
if true {
return nil
}
return (“123”,”ads”)
}
默認(rèn)參數(shù)值
默認(rèn)值 的 參數(shù) 放在最后, 非默認(rèn)參數(shù)的順序是一致的
\0
\
\t
\n
\r
\”
`
\’
\u{222f9abcd}
Character
override
重寫(xiě)屬性馍驯、方法藐俺、重寫(xiě)下標(biāo)
在重寫(xiě)定義的前面 加上 override關(guān)鍵字。
重寫(xiě)屬性觀察器
計(jì)算型屬性 和 和屬性觀察器
計(jì)算型屬性不能用let
計(jì)算型屬性:提供setter和getter方法泥彤。前面加var關(guān)鍵字
只讀計(jì)算型屬性:去掉setter方法,但是前面的var關(guān)鍵字不能省
延遲存儲(chǔ)型屬性:前面加layer
存儲(chǔ)型屬性:去掉layer
屬性觀察期:使用關(guān)鍵字willset卿啡,didset 后面 加花括號(hào)
全局變量:
var gloableString:String = "asdfadf"
只讀計(jì)算型全局變量:
var gloableString2:String {
get {
return "asdfas"
}
}
var gloableString3:String = {return "asdfa"}()
不能加lazy:下面編譯錯(cuò)誤
lazy var gloabelString4:String = "asdfasdf"
class add {
let adfa:String {
return “asdfasdf”
}
}
case add {
var adfa
var ad:String {
get {
return “asdfasdf”
}
set (asdf) {
adfa = asdf
}
}
}
存儲(chǔ)屬性添加屬性觀察器
延遲
intrinsic
1, 函數(shù) 吟吝, 閉包 , 區(qū)別
函數(shù)作為參數(shù)傳遞
閉包作為參數(shù)傳遞颈娜?
@autoclosure 自動(dòng)閉包
@noescape 非逃逸閉包
行參中的閉包默認(rèn)是逃逸的:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
undefineEscapeFunc {
print("hellooo")
}
let aAction = handlers.first!
aAction()
return true
}
typealias aBlockType = ()->()
var handlers = aBlockType
func undefineEscapeFunc(a:()->()){
handlers.append(a)
}
@autoclosure(escaping)
1剑逃、為協(xié)議擴(kuò)展 添加限制條件。限制條件 寫(xiě)在 協(xié)議名 之后官辽, 使用where子句來(lái)描述
數(shù)組 符合 collectiontype協(xié)議蛹磺, 而數(shù)組中的元素 又符合 textrepresentable協(xié)議
extension collectiontype where generator.element:textrepresentable {
}
2、類型約束
c1必須符合container協(xié)議同仆, c2必須符合container協(xié)議萤捆,c1的itemtype 必須 和c2的itemtype類型相同]
func allitemsMatch <c1:container, c2:Container where c1.itemtype == c2.itemtype, c1.itemtype:equatable> (somecontainer:c1,_ anothercontainer:c2)->bool{
}
0..<numberOfSections
類型、表達(dá)式俗批、語(yǔ)句俗或、聲明、特性岁忘、模式辛慰、范型參數(shù)
枚舉
枚舉關(guān)聯(lián)值
枚舉原始值
遞歸枚舉:indirect
枚舉 本質(zhì)上 就是 用來(lái) 描述數(shù)據(jù)的。 是某種數(shù)據(jù)的 一種 描述形式干像,它本身不需要有計(jì)算帅腌。
空合運(yùn)算符
let a:String ?
let b:String = “asdfasd”
a != nil ? a! : b
a = a ?? b
閉合區(qū)間
a…b
for index in 1…5 {
print(index)
}
半開(kāi)區(qū)間
a..<b
for i in 0 ..< count {
}
func afads(numbers: double … ) -> Double {
var totoal:Double = 10
for number in numbers {
totaol += number
}
return totoal / double(numbers.count)
}
訪問(wèn)控制
模塊 和源文件、
訪問(wèn)級(jí)別麻汰、
訪問(wèn)控制語(yǔ)法:public,internal,private
自定義類型:
元祖速客、 函數(shù)、 枚舉什乙、 嵌套
類類型:
如果想為 一個(gè) 自定義的類型挽封, 指定訪問(wèn)級(jí)別
如果將類型 指定為private,那么這個(gè)類型的所有成員,都為private
如果將類型 指定為public辅愿,或者internal智亮,或者不指定的,默認(rèn)是internal点待,它的成員默認(rèn)是internal
元祖:(var name:String, var sex:String,var idno:String) 阔蛉?
(public var name:String, internal var sex:String, private var idno:String)
函數(shù)類型:
private func somefunction()->(someinternalclass, someprivateclass){}
枚舉:
public enum compasspoint{
case north
case south
}
以最低級(jí)別的訪問(wèn)權(quán)限為準(zhǔn)
可以通過(guò) 重寫(xiě) 為繼承來(lái)的類成員 提供更高的訪問(wèn)級(jí)別。
類A 的私有成員 外部不能訪問(wèn)
public class A {
private func someMthoed(){}
}
類B癞埠,繼承類A状原,可以重寫(xiě)類A的私有方法, 因?yàn)轭怋的實(shí)現(xiàn)跟類A在同一個(gè)源文件里面苗踪。
它把類A的私有成員拉升到高一級(jí)別的訪問(wèn)權(quán)限了颠区, 給外部的文件訪問(wèn)類B的方法
internal class B: A {
override internal func someMthoed(){}
}
類型 變量
不能定義一個(gè)public級(jí)別的屬性,但是它的類型卻是private級(jí)別的 變量
getter通铲, 和setter
stuct trackedstring {
var numberofeidits = 0
private(set) var adfa = 1
private(get) var adf = 12
}
構(gòu)造器
可以低于 等于 所屬類的類型 的訪問(wèn)級(jí)別毕莱。必要構(gòu)造器 必須和所屬類型的訪問(wèn)級(jí)別相同
默認(rèn)構(gòu)造器的訪問(wèn)級(jí)別與所屬類型的訪問(wèn)級(jí)別相同。但是如果類型的訪問(wèn)級(jí)別是public颅夺,則它的默認(rèn)構(gòu)造器的
訪問(wèn)級(jí)別是internal朋截, 如果希望默認(rèn)的構(gòu)造器在別的文件中使用,必須提供一個(gè) public訪問(wèn)級(jí)別的
無(wú)參數(shù)構(gòu)造器吧黄。
如果 結(jié)構(gòu)體中的 存儲(chǔ)型屬性的訪問(wèn)級(jí)別是private部服,默認(rèn)的逐一構(gòu)造器的訪問(wèn)級(jí)別是private
協(xié)議
協(xié)議繼承 不能通過(guò)繼承,把原來(lái)的協(xié)議訪問(wèn)級(jí)別拉高
protocol asdfasd {
func adfa()
var hellor:String
let idnor:Int
}
internal protocol asdfasd {
private func adfa()
private var hellor:String
internal let idnor:Int
}
internal protocol fasdHeritProtocol:adfas {
}
類型別名
類型別名的訪問(wèn)級(jí)別 不可高于其他表示的類型的訪問(wèn)級(jí)別
private typealias helloClalss = String