類和對象的方法與屬性---懶載入與私人事件---單例與私人化建構函式,私人化建構函式
對象屬性:
1、private修飾的屬性:只能在本類內部訪問,分類和外部都不能訪問(徹底私人)
2、fileprivate修飾的屬性:在本類和分類中可以訪問,外部不能訪問(部分私人)
3、直接用let或var修飾的屬性:在本類、分類和外部都可以訪問(開放)
4、在分類中只能聲明計算屬性,不能聲明儲存屬性
1 // 屬性:可以被外界訪問2 var name:String?3 4 // private修飾的屬性:只能在本類內部訪問,分類和外部都不能訪問5 private var age:String?6 7 // fileprivate修飾的屬性:在本類和分類中可以訪問,外部不能訪問8 fileprivate var gender:String?
1 import UIKit 2 3 class Person: NSObject { 4 5 } 6 7 extension Person{ 8 9 // 分類中只能聲明計算屬性,不能聲明儲存屬性10 var desc:String{11 return "我是小明"12 }13 }
類屬性:
1、在本類中使用class修飾的屬性,調用時《類名.屬性名稱》
2、在分類中使用static修飾的屬性(注意:分類中只能定義計算屬性,不能定義儲存屬性),調用時《類名.屬性名稱》
1 // class修飾本類屬性:通過《類名.屬性名稱》進行訪問2 class var classAttribute:String{3 return "I'm the classAttribute."4 }5 6 // static修飾分類中計算屬性:通過《類名.屬性名稱》進行訪問7 static var staticAttribute:String{8 return "I'm the staticAttribute."9 }
對象方法:
1、直接用func修飾,本類、分類、外界都可以調用(開放)
2、用private修飾,只有在本類中可以調用(徹底私人)
3、用fileprivate修飾,在本類、分類中可以訪問,外部不能訪問(部分私人)
1 // 直接用func的方法,本類、分類、外界都可以調用 2 func sayHi() -> Void { 3 4 } 5 // 只有在本類中可以調用 6 private func sayHi3(){ 7 8 } 9 // 只有在本類、分類中調用10 fileprivate func sayHi2() -> (){11 12 }
類方法:
1、在本類中使用class修飾類方法
2、在分類中使用static修飾類方法
1 class Person: NSObject { 2 3 // 在本類中,類方法用class修飾 4 class func sayHi() -> (){ 5 print("Hello world,I'm the class method.") 6 } 7 } 8 9 // extension 相當於OC 中的分類10 extension Person{11 12 // 在分類中,類方法用static修飾13 static func sayHello() -> Void{14 print("Hello world,I'm the static method.")15 }16 }
懶載入與私人事件:
懶載入的關鍵字用lazy修飾,有三種建立方法
用private修飾的事件,要想添加給按鈕,前面必須用@objc修飾
1 import UIKit 2 3 class Person: NSObject { 4 5 // 懶載入方式一:直接建立 6 private lazy var msgLabel = UILabel() 7 8 // 懶載入方式二:使用對象方法建立,方法名前要加self 9 private lazy var content:String = self.createContent()10 11 // 懶載入方式三:使用閉包建立12 // swift懶載入用lazy修飾,代碼只執行一次,哪怕對象nil了,也不會再次執行13 // OC中的懶載入是重寫get方法,當對象為nil時,會重新載入14 // swift中懶載入使用閉包方式時,閉包可以省略 () in ,直接返回對象即可15 private lazy var button:UIButton = {16 let button = UIButton()17 18 // swift中使用#selector給按鈕添加事件,注意帶參數寫法(btn:)19 // OC中使用@selector給按鈕添加事件20 button.addTarget(self, action: #selector(buttonAction(btn:)), for: .touchUpInside)21 22 return button23 }()24 25 26 // private修飾的事件函數,在Swift運行迴圈裡面找不到27 // 解決方案:使用oc,基於運行時使用kvc動態派發調用該事件,@objc告訴編譯器使用oc的機制去調用這個事件28 @objc private func buttonAction(btn:UIButton){29 30 }31 32 func createContent() -> String{33 return "建立的內容"34 }35 }
單例:用static修飾私人化建構函式,外部不可以通過《類名()》建立對象,只能訪問單例,更嚴謹
1 import UIKit 2 3 class Person: NSObject { 4 5 // 單例對象,用static修飾 6 static let currentPerson:Person = Person() 7 8 // 使用閉包方式建立單例對象 9 static let sharedPerson:Person = {10 let per = Person()11 return per12 }()13 14 // 私人化建構函式,外界不可以通過《Person()》建立對象,只能訪問單例對象15 private override init() {16 super.init()17 }18 }