属性的存储
延时存储属性
计算属性
属性观察者
静态属性
注意:OC中的属性的替代get/set的方法,为了实现对成员变量的封装,实际上是swift中的计算属性。
在swift中的属性存储就是OC中的一般意义上的成员变量,ps:swift中是没有成员变量的
实例化: //结构体的属性初始化不用需要赋值 struct FixedRangeStruct{ var firstValue:Int let length:Int } var rangeOfStruct = FixedRangeStruct(firstValue:0,length:4) rangeOfStruct.firstValue = 12 //类的属性初始化需要赋值 class FixedRangeClass { var firstValue = 0 let lenth = 0 } var rangeOfClass = FixedRangeClass() rangeOfClass.firstValue = 12
类内部属性实例化的时候,使用lazy代表暂不实例化,等第一次使用的时候再实例化。这样的好处的,当类的属性是另一个类的时候,而且属性类极少使用的时候,可以防止一次性加载2个类的东西。
使用场景:属性使用类低,而且属性结构大,就可以使用lazy。如果是小属性,或者属性类十分频繁使用,那千万不要使用lazy
class DataImporter { var fileName = "data.txt" } class DataManager { lazy var importer = DataImporter() var data = "" } let manager = DataManager() manager.data += "Some data" print(manager.importer.fileName)
有的时候一些属性是通过其他的属性计算出来的,通过get和set访问器对其访问
struct Point { var x = 0.0,y = 0.0 } struct Size { var width = 0.0,height = 0.0 } struct Rect { var orgin = Point() var size = Size() var center : Point{ get{ let centerX = orgin.x + (size.width/2) let centerY = orgin.y + (size.height/2) return Point(x: centerX, y: centerY) } set(newCenter){ orgin.x = newCenter.x - (size.width/2) orgin.y = newCenter.y - (size.height/2) } } } var square = Rect(orgin: Point(x: 0.0, y: 0.0), size: Size(width: 10.0, height: 10.0)) //get let initSquareCenter = square.center //set square.center = Point(x: 15.0, y: 15.0) print("\(initSquareCenter)、(\(square.orgin.x),\(square.orgin.y))")
为了监听属性的变化,swift通过了属性观察者
willSet观察者是在存储之前调用
didSet新值存储后调用
class StepCounter { var totalSteps:Int = 0{ willSet(newTotalSteps){ print("About to set totalSteps to \(newTotalSteps) ") } didSet{ if totalSteps > oldValue{ print("Add \(totalSteps - oldValue) steps") } } } } let stepCount = StepCounter() stepCount.totalSteps = 200 stepCount.totalSteps = 360 About to set totalSteps to 200 Add 200 steps About to set totalSteps to 360 Add 160 steps
静态属性在结构体中使用static定义,类中使用class定义。
struct AudioChannel { static let threshldLevel = 10 static var maxInputLeveForAllChannels = 20 var currentLevel : Int = 0 static var computedTypePropetry:Int{ //可以修饰函数,成为静态方法 return 2 } } var leftChannel = AudioChannel() var righrChannel = AudioChannel() leftChannel.currentLevel = 7 print(leftChannel.currentLevel) print(AudioChannel.maxInputLeveForAllChannels) //调用静态属性的时候,只能有类名,不能有实例名
类和结构体内的函数就是方法
func修饰的方法就是实例方法
被静态符static或class修饰的方法就是静态方法
为区分类或结构体内的属性与类属性冲突
struct Point { var x = 0.0, y = 0.0 func isToTheRightOfx(x:Double) -> Bool{ return self.x > x } } let somePoint = Point(x: 4.0, y: 5.0) if somePoint.isToTheRightOfx(1.0){ print("yes") }