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
}