昨天太忙福也,整整折騰了一天。中午和晚上抽時(shí)間把blog搬到簡(jiǎn)書了攀圈,感覺(jué)棒棒的暴凑。
今天中午看到了我最喜歡的泛型,swift的各種東西赘来,基本都已展開(kāi)的差不多了现喳。
上午和下午凯傲,看了許多人的博客,越來(lái)越感覺(jué)自己是井底之蛙嗦篱,外面的世界好大冰单。而且但凡有點(diǎn)成績(jī)的人,總是有一些拿的出手的東西灸促。我雖然這兩年做了蠻多東西球凰,但好像都是淺嘗輒止糖埋,唉码党。以后找機(jī)會(huì)整理一下當(dāng)年寫的內(nèi)存模型吧泽艘。
筆記如下:
1 擴(kuò)展中添加協(xié)議成員。
即使無(wú)法修改源代碼吃度,依然可以通過(guò)擴(kuò)展來(lái)擴(kuò)充已存在的類型(類,結(jié)構(gòu)體贴硫,枚舉)椿每。擴(kuò)展可為已存在的類型添加屬性,方法英遭,下標(biāo)间护,協(xié)議等。
注意:通過(guò)擴(kuò)展為已存在的類型添加協(xié)議時(shí)挖诸,該類型的所有實(shí)例也會(huì)隨之添加協(xié)議中的方法汁尺。
protocol TextRepresentable {
func asText() -> String
}
extension Int: TextRepresentable {
func asText() -> String {
return "\(self)"
}
}
print(3.asText())
當(dāng)一個(gè)類型已經(jīng)實(shí)現(xiàn)協(xié)議中的所有要求,卻沒(méi)有聲明時(shí)多律,可以通過(guò)擴(kuò)展來(lái)補(bǔ)充協(xié)議聲明痴突。
struct Hamster {
var name: String
func asText() -> String {
return "\(name)"
}
}
extension Hamster: TextRepresentable {}
var someText: TextRepresentable = Hamster(name: "abcd")
print(someText.asText())
注意:即使?jié)M足了協(xié)議要求,類型也不會(huì)自動(dòng)轉(zhuǎn)變狼荞,因此你必須為它做出明顯的協(xié)議聲明辽装。
2 協(xié)議的繼承
協(xié)議能夠繼承一到多個(gè)協(xié)議。語(yǔ)法與類繼承基本相同相味。
protocol InheritingProtocol: SomeProtocol, AnotherProtocol {
}
可以在協(xié)議的繼承列表中拾积,通過(guò)添加關(guān)鍵字『class』,限制協(xié)議只能適配到類(class)型丰涉,結(jié)構(gòu)和枚舉不能遵循該協(xié)議拓巧。
protocol SomeClassOnlyProtocol: class, SomeOtherProtocol {
}
插播一條關(guān)于枚舉的,枚舉里不能含有存儲(chǔ)屬性一死,可以含有計(jì)算屬性玲销,這一點(diǎn)和java不同。
enum A {
case a
//var bb = 2 錯(cuò)誤摘符,enum不能有存儲(chǔ)屬性
var cc: String {
return "\(self)"
}
}
print(A.a.cc)
一個(gè)協(xié)議可以由多個(gè)協(xié)議采用protocol<SomeProtocol, AnotherProtocol>這樣的格式進(jìn)行組合贤斜,稱為協(xié)議合成策吠。
protocol Name {
var name: String { get }
}
protocol Age {
var age: String { get }
}
protocol Height {
var height: Int { get }
}
struct Persion: Name, Age, Height {
var name: String
var age: String
var height: Int
}
func happyBirthday(persion: protocol<Name, Age, Height>) {
print("happy birthday, \(persion.name), \(persion.age), \(persion.height)")
}
happyBirthday(Persion(name: "abc", age: "10", height: 120))
3 檢驗(yàn)協(xié)議的一致性
使用is和as操作符來(lái)檢查協(xié)議的一致性或轉(zhuǎn)換協(xié)議類型〈袢蓿基本和類的轉(zhuǎn)換相同猴抹。
is操作符用來(lái)檢查是否遵循了某個(gè)協(xié)議。
as?返回一個(gè)可選值锁荔,當(dāng)實(shí)例遵循了協(xié)議時(shí)蟀给,返回協(xié)議,否則返回nil
as可以強(qiáng)制向下轉(zhuǎn)型阳堕。
@objc //表示協(xié)議可選跋理,也可以用來(lái)表述暴露給object-c的代碼
protocol HasArea {
optional func increment(count: Int) -> Int
optional var fixed: Int { get } //調(diào)用方式同可選鏈等(?)
}
4 泛型,swift的泛型和java的泛型寫法上蠻類似恬总,不知道實(shí)現(xiàn)上是不是也很像前普。
class Stack<T> {
var array = [T]()
func pop() -> T? {
return array.popLast()
}
func push(value: T) {
array.append(value)
}
}
var stack = Stack<Int>()
stack.push(2)
stack.pop()
stack.pop()
5 類型約束。有時(shí)候?qū)κ褂迷诜盒秃瘮?shù)和泛型類型上的類型強(qiáng)制約束為某種特定類型是非常有用的壹堰。類型約束指定了一個(gè)必須必須繼承自指定類的類型參數(shù)拭卿,或是遵循一個(gè)特定的協(xié)議。
例如:
func findIndex<T: Equatable>(array: [T], valueToFind: T) -> Int? {
var index: Int?
for (i, value) in array.enumerate() {
if (value == valueToFind) {
index = i
}
}
return index
}
var testArray = [1, 2, 3, 4]
findIndex(testArray, valueToFind: 3)
swift標(biāo)準(zhǔn)庫(kù)定義了一個(gè)Equatable協(xié)議贱纠,該協(xié)議要求任何遵循該協(xié)議的類型實(shí)現(xiàn)(==)和(!=)對(duì)任何兩個(gè)該類型進(jìn)行比較峻厚。所有的swift標(biāo)準(zhǔn)類型自動(dòng)支持Equatable協(xié)議。
2016年的計(jì)劃谆焊,唉惠桃,沉下心來(lái),不動(dòng)如山辖试,好好做點(diǎn)東西出來(lái)刽射。不能浪費(fèi)了這么好的基礎(chǔ)啊。