7.属性与方法
2020-06-08 本文已影响0人
LucXion
存储属性与计算属性,
类属性类方法class/static,
使用let和var接收值类型或引用类型变量的区别,
属性监听器willSet、didSet,
类实例通过下标获取数据subscript
Swift语言中对于属性的定义分为两类,分别是存储属性与计算属性。从字面意思理解,存储属性的作用是存储类的某个特征,而计算属性的作用是通过运算告知外界类的某个特征。存储属性只能用于类和结构体,计算属性可以用于类、结构体和枚举。
变量类型的属性可以修改,常量类型的属性不可修改。但是对于值类型实例,如果实例是常量接收的,则其中变量的属性也不可以修改。对于引用类型实例,无论实例是变量还是常量接收的,都可以修改变量类型的属性.
let 对象= struct结构 + var属性 // 那么var属性不能修改
var 对象= struct结构 + var属性 // var属性可以修改
let 对象= class类型 + var属性 // var属性可以修改
存储属性可以通过lazy关键字设置为延迟加载,但是延迟加载的属性必须设置默认值
延时存储属性并不是线程安全的,如果在多个线程中对延时存储属性进行调用,不能保证其只被构造一次。
class Circle {
var center:CGPoint
var r:Double
lazy var something:String = "happy"// 延迟属性
// 计算属性
var round:Double {// 将属性扩展作用域
set (value){// 分别声明set、get,set中有个newValue默认值,这里自定义成value
r = value / 2 / Double.pi
}
get {
return 2 * Double.pi * r
}
}
var round:Double {
// 由于setter是可选的,不实现代表该计算属性为只读,只剩下一个getter时可省略成这样的形式
return 2 * Double.pi * r
}
init(center:CGPoint,r:Double) {
self.center = center
self.r = r
}
}
属性监听器,用于监听存储属性的赋值操作 willSet/didSet
class Circle {
var center:CGPoint = CGPoint(x: 0, y: 0) {
willSet {
print("\(newValue)")//是一个常量
}
didSet {
print("\(oldValue)")
self.center = CGPoint(x: 15, y: 15)// 此处可以修改属性的最终值
}
}
init(center:CGPoint) {
// 设置默认值和init中对属性初始化都不会触发属性监听器
self.center = CGPoint(x: 0, y: 0)
}
}
类属性
class Student {
// static修饰,静态属性
static var name:String = ""
static var key:String {
return "key"
}
// class修饰,计算属性,子类可重写
class var age:Int {
return 1
}
}
class StudentA :Student {
override class var age: Int {
return 3
}
}
通过下标获取类属性
// 对象下标调用
class Student {
var array:Array<Array<Int>>
init(array:Array<Array<Int>>) {
self.array = array
}
subscript (_ parama:Int,_ parama2:Int)->Int{
set {
array[parama][parama2] = newValue
}
get {
return array[parama][parama2]
}
}
}
var temp = Student.init(array: [[1,2,3,4,5],[4,5,6,7,8],[123]])
print(temp[1,2])