挺辛苦的一天回铛。
昨天晚上回家,不知道抽哪門子風(fēng)芯急,買了一大桶可樂勺届,喝了不少。半夜躺在床上一直睡不著娶耍,翻來覆去想各種奇怪的事情免姿,最后終于在早上5點睡著。早上8點半又起來搶火車票榕酒,好消息是搶到了胚膊。
白天很忙,一直在寫一個數(shù)據(jù)統(tǒng)計的腳本想鹰,用python+sql最終實現(xiàn)的∥赏瘢現(xiàn)在想來,還是覺得python的語法最舒服辑舷,很多東西很簡潔喻犁。
今天swift學(xué)的還算不錯,中午看了30來分鐘何缓,下午又看了1個多小時肢础。很平穩(wěn)的推進(jìn)過程。
筆記如下:
1 關(guān)聯(lián)類型碌廓。
在類型不確定的情況下传轰,需要聲明一個或多個關(guān)聯(lián)類型。相當(dāng)于一個占位名谷婆。作為關(guān)聯(lián)類型在協(xié)議被實現(xiàn)之前是不需要指定的慨蛙。關(guān)鍵字:typealias
protocol Container {
? ?typealias ItemType
? ?mutating func append(item: ItemType)
? ?var count: Int { get }
? ?subscript(index: Int) -> ItemType { get }
}
struct IntContainer: Container {
? ?var data = [T]()
? ?typealias ItemType = T //遵循協(xié)議實現(xiàn)類型, 這行可以注釋掉辽聊,因為swift的類型推斷
? ?var count: Int {
? ? ? ?return data.count
? ?}
? ?mutating func append(item: T) {
? ? ? ?data.append(item)
? ?}
? ?subscript(index: Int) -> T {
? ? ? ?return data[index]
? ?}
}
如果一個已有的類已滿足協(xié)議所有的功能,比如Array就滿足Container的所有要求期贫,可以簡單的直接聲明Array遵循該協(xié)議:
extension Array: Container{}
2 where語句類型約束跟匆。對于關(guān)聯(lián)類型定義約束是非常有用的⊥常可以使用where語句來定義參數(shù)的約束贾铝。
func allItemsMatch
? ?where C1.ItemType ?== C2.ItemType, C1.ItemType: Equatable>
? ?(leftContainer: C1, rightContainer: C2) -> Bool {
? ?var res = true
? ?if leftContainer.count != rightContainer.count {
? ? ? ?res = false
? ?} else {
? ? ? ?for i in 0..
? ? ? ? ? ?if leftContainer[i] != rightContainer[i] {
? ? ? ? ? ? ? ?res = false
? ? ? ? ? ? ? ?break
? ? ? ? ? ?}
? ? ? ?}
? ?}
? ?return res
}
3 訪問級別。swift提供了三種訪問級別埠帕,public垢揩,internal,private敛瓷,基本類似于java的public叁巨,包訪問權(quán)限,private呐籽。
默認(rèn)訪問權(quán)限為internal锋勺。
當(dāng)開發(fā)Framework時,需要把一些實體定義為public級別狡蝶,這些被定義為public的實體庶橱,就是這個Framework的API。
類的訪問級別也會影響到類成員(屬性贪惹,函數(shù)苏章,初始化方法)的默認(rèn)訪問級別。如果類聲明為private奏瞬,那么該類所有的成員的默認(rèn)訪問級別也是private枫绅。如果將類聲明為public或internal或是不明確的指定訪問級別,那么該類的所有成員的訪問級別是internal硼端。
注意:public類的默認(rèn)訪問權(quán)限是internal而不是public并淋,如果想將某個成員聲明為public,必須明確使用修飾符public珍昨。
public class SomePublicClass { //顯式的public類
? ?public var somePublicProperty = 0 //顯式的public成員
? ?var someInternalProperty = 0 //隱式的internal成員
? ?private func somePrivateMethod() {} //顯式的private成員
}
class SomeInternalClass { //隱式的internal類
? ?var someInternalProperty = 0 //隱式的internal成員
? ?private var somePrivateProperty = 0 //顯示的private成員
}
private class SomePrivateClass { //顯式的private類
? ?var somePrivateProperty = 0 //隱式的private成員
? ?private func somePrivateMethod() {} //顯式的private成員
}