目錄
-
swift屬性
- 存儲屬性
- 懶加載屬性
- 計算屬性
- 屬性監(jiān)聽
- 類型屬性
- swift析構(gòu)函數(shù)
- swift調(diào)用OC單例類方法
swift屬性
存儲屬性
- 存儲屬性:用于存儲一個常量或者變量
- 結(jié)構(gòu)體實例賦值給常量寨蹋,該實例屬性不能被修改(因為結(jié)構(gòu)體屬于值類型,當值類型的實例被聲明為常量的時候扔茅,它的所有屬性也就成為了常量)已旧。如下:
struct Teacher {
var name = ""
var age = 0
}
let teacher = Teacher()
//因為 teacher 被聲明成了常量,即使name是一個變量屬性召娜,也無法修改
teacher.name = "good teacher" //報錯
- 類實例賦值給常量运褪,可以修改該實例變量屬性(類屬于引用類型)
class Student: NSObject {
var name = ""
var age = 0
}
let stu = Student()
stu.name = "good student"
懶加載屬性
懶加載屬性:是指當?shù)谝淮伪徽{(diào)用的時候才會計算其初始值的屬性。在屬性聲明前使用lazy來表示延遲存儲屬性玖瘸。
特點:
- 1.用到的時候才會加載
- 2.多次使用只會加載一次
注意:必須將延遲存儲屬性聲明成變量秸讹,因為屬性的初始值可能在實例構(gòu)造完成之后才會得到。而常量屬性在構(gòu)造完成之前必須要有初始值雅倒,因此無法聲明成懶加載屬性璃诀。
class Student: NSObject {
lazy var name = ""
var age = 0
}
let student = Student()
print(student.name)
也可以這樣
lazy var keychain : KeychainSwift = {
let chain = KeychainSwift()
return chain
}()
計算屬性
計算型屬性:不直接存儲值,而是通過get
蔑匣、set
方法來取值或賦值
class Student: NSObject {
var firstName = ""
var lastName = ""
//定義計算屬性
var fullName:String {
//定義計算屬性的getter方法劣欢,該方法的返回值由firstName、lastName兩個存儲屬性決定
get{
return firstName + lastName
}
//定義計算屬性的setter方法(默認名稱 newValue)
set{
self.firstName = newValue.components(separatedBy: " ")[0]
self.lastName = newValue.components(separatedBy: " ")[1]
}
}
}
let student = Student()
student.fullName = "xiao ming"
print(student.firstName) //xiao
print(student.lastName)
只讀屬性裁良,則無需set
部分
class Student: NSObject {
var firstName = ""
var lastName = ""
var fullName:String {
get{
return firstName + lastName
}
}
}
let student = Student()
student.firstName = "xiao"
student.lastName = "ming"
print(student.fullName) //xiaoming
屬性監(jiān)聽
-
willSet
在新的值被設(shè)置之前調(diào)用(willSet
會將新屬性值作為常量參數(shù)傳入凿将,默認名稱newValue
) -
didSet
在新的值被設(shè)置之后調(diào)用(didSet
會將舊的屬性值作為參數(shù)傳入,默認參數(shù)名稱oldValue
表示)
class Student: NSObject {
var name:String = "" {
willSet(newName){
print("新值是:\(newName)")
}
didSet{
print("舊值是:\(oldValue)")
}
}
}
let student = Student()
student.name = "小白"
print("---")
student.name = "小黑"
/*
新值是:小白
舊值是:
---
新值是:小黑
舊值是:小白
*/
類型屬性
- 類型屬性:是指屬性屬于某一個類或某一個值類型(結(jié)構(gòu)體趴久、枚舉)的而不是屬于某一個對象的丸相。可以認為所有的實例公用這個屬性
- 類型屬性必須有默認值
- 使用關(guān)鍵字
static
來定義類型屬性 - 也可以用
classe
來為類定義類型屬性彼棍。
struct Structname {
static var storedTypeProperty = " "
static var computedTypeProperty: Int {
// 這里返回一個 Int 值
}
}
enum Enumname {
static var storedTypeProperty = " "
static var computedTypeProperty: Int {
// 這里返回一個 Int 值
}
}
class Classname {
class var computedTypeProperty: Int {
// 這里返回一個 Int 值
}
}
swift析構(gòu)函數(shù)
swift的析構(gòu)函數(shù)為deinit
灭忠,在這里做一些移除觀察者、置nil
等操作座硕,相當于OC
中的dealloc
方法弛作。代碼如下
deinit{
self.reachability?.stopNotifier()
self.reachability = nil
self.loadWebView.configuration.userContentController.removeAllUserScripts()
NotificationCenter.default.removeObserver(self)
}
swift調(diào)用OC單例類方法
在swift中調(diào)用方法都是直接點語法出來,不論是+
方法(類方法)還是-
方法直接點出來华匾。但是筆者今天突然發(fā)現(xiàn)之前寫的一個oc時間管理類在swift中點語法不出來單例方法映琳,一直顯示has no member 'manager'
。百思不得其解蜘拉,后來終于發(fā)現(xiàn)了問題所在萨西。
原因:Xcode限制了swift對OC初始化相關(guān)方法的調(diào)用,+ (instancetype)manager;
寫法會被忽略旭旭。
解決方案:
使用Xcode認可的關(guān)鍵字default
谎脯、singleton
、shared
為前綴聲明方法名持寄。
+ (instancetype)defaultManager;
+ (instancetype)singleton;
+ (instancetype)sharedManager;
于是我就把原來的單例方法重新命名了源梭,manager
改為defaultManager
娱俺。
但是這也有問題,就是找不到defaultManager
這個方法废麻,只能找到default
方法荠卷。
點進去發(fā)現(xiàn)default
就是defaultManager
。
類.default()