Swift---10.属性
-
属性(类,结构体或枚举中,某一个成员变量,就是该类,结构体或枚举的属性)
-
存储属性
-
存在于类,结构体中,枚举中不存在,定义属性时,可以定义属性的类型,默认值.与定义变量常量相同,使用var
表明该属性是变量,let
表明该属性是常量.
class FirstClass { var firstValue:String? var secondValue = 2 let thirdValue = 3 } struct FirstStruct { var firstValue:String? var secondValue = 2 let thirdValue = 3 } //类是引用类型,就算被赋值给一个常量,也依然可以修改其值 let firstClass = FirstClass() firstClass.secondValue = 3 //报错,结构体是值类型,如果定义为常量,则所有的值都不可以被改变 let firstStruct = FirstStruct(firstValue: "first", secondValue: 3) firstStruct.secondValue = 4
- #####延迟存储属性
在成员名前,添加lazy
关键字,表明该属性只会在使用到的时候才被创建,由于不是一开始就定义的成员,所以我们必须设置改成员为变量.lazy
属性线程不安全
class FirstClass { var firstValue:String? lazy var secondValue:Int = { return 2 }() let thirdValue = 3 } let firstClass = FirstClass() firstClass.secondValue
- 计算属性(计算属性不存储值,它提供了set
与get
方法,使我们可以间接的操作其他变量或者属性,写法为在计算属性的类型后添加尾随闭包,在闭包中添加set
与get
方法,set
方法中,系统默认为我们提供了newValue
参数)
//定义一个结构体 struct number { var a = 0 var b = 0 } //定义类 class TestGetSet { var total:Int = 0 var number:number{ get { return self.number } set (newNumber) { total = newNumber.a + newNumber.b } } var number1:number{ get { return self.number } set { total = newValue.a + newValue.b } } } let test = TestGetSet() test.number = number(a: 3, b: 4) print(test.total)
- 只读计算属性(了解OC的,应该知道,定义类属性时,会有一个readOnly
选项,即改属性只有getter
没有setter
,Swift中,对于计算属性同样提供了只读选项,只要闭包中不提供set
方法,即指明该计算属性为只读属性.同样的,我们可以省略关键字get
)
struct total { var a:Int = 0 var b:Int = 0 var total:Int{ return a+b } } let test = total(a: 10, b: 10) test.total
- 注意我们使用只读计算属性时,必须使用var
关键字,因为只有变量才能改变值
- 属性监听者(属性拥有监听者,延迟存储除外,在属性的值改变时,他们会被调起.需要注意非继承的计算属性不需要添加监听者,因为我们可以在它的set
方法中监听到属性的变动)
- willSet(即将设置时,跟计算属性的set方法一样,Swift也为其提供了默认的newValue
)
- didSet(设置完成后,该方法提供了默认值为oldValue
,在didSet
方法中,对该属性的操作不会重新引起didSet
的调用)
class Obersevers { var number:Int = 0{ willSet { print("将要设置number为\(newValue)") } didSet { print("number由\(oldValue)变为\(number)") } } } let oberse = Obersevers() oberse.number = 10
- 类属性(类似与OC中的类方法,可以由类直接调起,使用static
定义,若想要让它的子类可以对其进行重写,需要使用class
关键词)
class StaticTest { static var number = 10 static var numberTimeFive:Int{ return number * 5 } } print(StaticTest.numberTimeFive) StaticTest.number = 5 print(StaticTest.numberTimeFive)
- 使用闭包或函数设置属性的默认值
class SetDefault { var board:[Bool] = { var tempArray = [Bool]() var isBlack = false for i in 1...8 { for j in 1...8 { tempArray.append(isBlack) isBlack = !isBlack } isBlack = !isBlack } return tempArray }() func squareIsBlackAt(row: Int, column: Int) -> Bool { return board[(row * 8) + column] } } let setDefault = SetDefault() setDefault.squareIsBlackAt(row: 2, column: 1)