Swift知識點(1)

1、willSet與didSet(屬性觀察)

willSet: 在屬性變化前做點什么,didSet:在屬性發(fā)生變化后做些什么肢预,另外注意:根據(jù)蘋果的注釋攘蔽,在初始化方法中設(shè)置屬性不會調(diào)用 willSet 和 didSet。當(dāng)設(shè)置的值和原來的值一樣時补胚,willSet和didSet也會被調(diào)用。

和set/get的區(qū)別是,要獲取舊值和新值鸳吸,寫起來更簡潔。

2速勇、lazy延遲加載

和OC中g(shù)etter方法實現(xiàn)懶加載一樣晌砾,在使用的時候才創(chuàng)建。注意:lazy屬性必須是變量(var修飾符)烦磁,因為常量屬性(let修飾符)必須在初始化之前就有值养匈,所以常量屬性不能定義為lazy。


lazy var names: NSArray = { 

  let names = NSArray() 

  print("只在首次訪問輸出") 

  return names

}()

【 擴(kuò)展知識點:這些方法可以配合像 map 或是 filter 這類接受閉包并進(jìn)行運(yùn)行的方法一起都伪,讓整個行為變成延時進(jìn)行的呕乎。在某些情況下這么做也對性能會有不小的幫助 】

3、NotificationCenter

添加監(jiān)聽:


NotificationCenter.default.addObserver(self, selector: #selector(bookPickASpotClassSuccess), name: NSNotification.Name.init("kBookPickASpotClassSuccess"), object: nil)

移除監(jiān)聽:


deinit {

  /// 移除通知  NotificationCenter.default.removeObserver(self)

}

發(fā)送監(jiān)聽:

/// 發(fā)送簡單數(shù)據(jù)


NotificationCenter.default.post(name: NSNotification.Name.init("XMNotification"), object: "Hello 2017")

/// 發(fā)送額外數(shù)據(jù)


let info = ["name":"Eric","age":21] as [String : Any]

NotificationCenter.default.post(name: NSNotification.Name.init("XMNotification"), object: "GoodBye 2016", userInfo: info)

4院溺、protocol

語法:


protocol SomeProtocol {

   // protocol definition goes here

}

遵守協(xié)議:


struct SomeStructure : FirstProtocol, AnotherProtocol {// structure definition goes here}

當(dāng)一個類既有父類楣嘁,又遵守其他協(xié)議時,將父類名寫在所遵守協(xié)議的前面
協(xié)議可以像類一樣珍逸,繼承自其他多個協(xié)議逐虚,通過將AnyObject(class)協(xié)議添加到協(xié)議的繼承列表中,來限制該協(xié)議只適用于class類型谆膳,而不適用于枚舉和結(jié)構(gòu)體叭爱。

【 擴(kuò)展 】:參考鏈接:http://www.reibang.com/p/d939c3443686

5、幾種屬性的分類

  • 存儲屬性:一般屬性漱病,用于存儲常量和變量
  • 計算屬性:計算屬性并不存儲實際的值买雾,而是提供一個getter和一個可選的setter來間接獲取和設(shè)置其它屬性,計算屬性一般只提供getter方法
    var averageScore : Double {
        get {
            return (chineseScore + mathScore) / 2
        }
        // 沒有意義,因為之后獲取值時依然是計算得到的
        // newValue是系統(tǒng)分配的變量名,內(nèi)部存儲著新值
        set {
            self.averageScore = newValue
        }
    }
  • 類屬性
    類屬性是與類相關(guān)聯(lián)的杨帽,而不是與類的實例相關(guān)聯(lián)
    所有的類和實例都共有一份類屬性.因此在某一處修改之后,該類屬性就會被修改
    類屬性的設(shè)置和修改,需要通過類來完成
    類屬性使用static來修飾
static var corseCount : Int = 0
  • 全局屬性
    寫在類外面的屬性

6漓穿、屬性訪問控制

Swift 中由低至高提供了 private,fileprivate注盈,internal晃危,public 和 open 五種訪問控制的權(quán)限。默認(rèn)的 internal。

  • public和open的區(qū)別是僚饭,open修飾的屬性和方法可以在target外訪問震叮,并且可以被繼承和重寫,public是只能被訪問鳍鸵,但不能被繼承和重寫苇瓣。
    private和fileprivate的區(qū)別:
  • fileprivate修飾的屬性和方法只要在同一個文件中,都可以被訪問偿乖。private只能在同一個文件的這個類的作用域里面訪問或者同一個文件的該類的類擴(kuò)展中訪問击罪。不管子類在不在同一個文件,都不能訪問贪薪。

7外邓、Swift的方法參數(shù)的內(nèi)部名稱和外部名稱

init(red redColor: Double) {
        
 }

其中red是外部參數(shù)名,外面的類調(diào)用的時候顯示的參數(shù)名古掏,redColor是內(nèi)部參數(shù)名,如果只有參數(shù)的內(nèi)部名稱侦啸,沒有外部名稱槽唾,編譯器會自動為參數(shù)創(chuàng)建一個和內(nèi)部名稱相同的外部名稱。

8光涂、Swift 4.0 @objc的使用

@objc是為了標(biāo)記可能會被OC調(diào)用的swift方法庞萍,之前只要繼承自NSObject,就默認(rèn)都會被隱式地標(biāo)記為@objc忘闻,現(xiàn)在是不會全部標(biāo)記钝计。

  • 在 Swift 4 中隱式 @objc 自動推斷只會發(fā)生在下面這種必須要使用 @objc 的情況:
    1)覆蓋父類的 Objective-C 方法
    2)符合一個 Objective-C 的協(xié)議
  • 大多數(shù)地方必須手工顯示地加上 @objc。
class MyClass: NSObject {
    @objc func print() { } //顯示的加上 @objc
    @objc func show() { } //顯示的加上 @objc
}
  • 如果在類前加上 @objcMembers齐佳,那么它私恬、它的子類、擴(kuò)展里的方法都會隱式的加上 @objc炼吴。
@objcMembers
class MyClass: NSObject {
    func print() { } //包含隱式的 @objc
    func show() { } //包含隱式的 @objc
}
 
extension MyClass {
    func baz() { } //包含隱式的 @objc
}
  • 如果在擴(kuò)展(extension)前加上 @objc本鸣,那么該擴(kuò)展里的方法都會隱式的加上 @objc。
class SwiftClass { }
 
@objc extension SwiftClass {
    func foo() { } //包含隱式的 @objc
    func bar() { } //包含隱式的 @objc
}
  • 如果在擴(kuò)展(extension)前加上 @nonobjc硅蹦,那么該擴(kuò)展里的方法都不會隱式的加上 @objc荣德。
@objcMembers
class MyClass : NSObject {
    func wibble() { } //包含隱式的 @objc
}
 
@nonobjc extension MyClass {
    func wobble() { } //不會包含隱式的 @objc
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市童芹,隨后出現(xiàn)的幾起案子涮瞻,更是在濱河造成了極大的恐慌,老刑警劉巖假褪,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件署咽,死亡現(xiàn)場離奇詭異,居然都是意外死亡嗜价,警方通過查閱死者的電腦和手機(jī)艇抠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門幕庐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人家淤,你說我怎么就攤上這事异剥。” “怎么了絮重?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵冤寿,是天一觀的道長。 經(jīng)常有香客問我青伤,道長督怜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任狠角,我火速辦了婚禮号杠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丰歌。我一直安慰自己姨蟋,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布立帖。 她就那樣靜靜地躺著眼溶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晓勇。 梳的紋絲不亂的頭發(fā)上堂飞,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機(jī)與錄音绑咱,去河邊找鬼羡玛。 笑死稼稿,一個胖子當(dāng)著我的面吹牛薄榛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播让歼,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼敞恋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谋右?” 一聲冷哼從身側(cè)響起硬猫,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后啸蜜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坑雅,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年衬横,在試婚紗的時候發(fā)現(xiàn)自己被綠了裹粤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遥诉。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖噪叙,靈堂內(nèi)的尸體忽然破棺而出矮锈,到底是詐尸還是另有隱情,我是刑警寧澤睁蕾,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布苞笨,位于F島的核電站,受9級特大地震影響壹店,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芝加,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一硅卢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧藏杖,春花似錦将塑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至来吩,卻和暖如春敢辩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背弟疆。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工戚长, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人怠苔。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓同廉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子迫肖,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,630評論 2 359