swift基础笔记5-属性
摘要:属性将值跟特定的类、结构或枚举关联。存储属性存储常量或变量作为实例的一部分,而计算属性计算(不是存储)一个值。计算属性可以用于类、结构体和枚举,存储属性只能用于类和结构体。 存储属性一个存储属性就是存储在特定类或结构体的实例里的一个常量或变量。可以使变量也可以是常量var/let。 常量结构体的存储属性如果创建了一个结构体的实例并将其赋值给一个常量,则无法修改该实例的任何属性,即使定义了变量存储属性。这种行为是由于结构体(struct)属于值类型。 延迟存储属性延迟存储属性是指当第一次被调用的时候才会计算其初始值的属性。在属性声明前使用 lazy 来标示一个延迟存储 属性。 存储属性和实例变量。。。 计算属性//计算属性
struct Point{
var x=0.0,y=0.0
}
struct Size{
var width = 0.0,height = 0.0
}
struct Rect{
var origin = Point()
var size = Size()
//
var center:Point{
get{
let centerX = origin.x+size.width/2.0
let centerY = origin.y+size.height/2.0
return Point(x: centerX,y: centerY)
}
//setter声明
set(newCenter){
origin.x = newCenter.x-size.width/2.0
origin.y = newCenter.y-size.height/2.0
}
}
}
var square = Rect(origin: Point(x: 0.0,y: 0.0),size: Size(width:10.0,height:10.0))
let initialSquareCenter = square.center
print("initialAquareCenter (initialSquareCenter)")
square.center = Point(x: 15.0,y: 15.0)
print("initialAquareCenter (initialSquareCenter)")
print("square.origin is now at((square.origin.x),(square.origin.y))")
便捷setter声明如果计算属性的 setter 没有定义表示新值的参数名,则可以使用默认名称 newValue 。下面是使用了便捷 sette r 声明的 Rect 结构体代码: struct AlternativeRect { var origin = Point() var size = Size()
var center: Point {
get {
let centerX = origin.x + (size.width / 2) let centerY = origin.y + (size.height / 2) return Point(x: centerX,y: centerY)
}
set {
origin.x = newValue.x - (size.width / 2)
origin.y = newValue.y - (size.height / 2) }
}
}
只读计算属性只有 getter 没有 setter 的计算属性就是只读计算属性。只读计算属性总是返回一个值,可以通过点运算符访 问,但不能设置新的值。 //根据长宽高计算体积
struct Cuboid {
var width = 0.0,height = 0.0,depth = 0.0 var volume: Double {
return width * height * depth }
}
let fourByFiveByTwo = Cuboid(width: 4.0,height: 5.0,depth: 2.0) print("the volume of fourByFiveByTwo is (fourByFiveByTwo.volume)") // 输出 "the volume of fourByFiveByTwo is 40.0"
属性观察器属性观察器监控和响应属性值的变化,每次属性被设置值的时候都会调用属性观察器,甚至新的值和现在的值相同的时候也不例外。 class StepCounter {
var totalSteps: Int = 0 {
willSet(newTotalSteps) {
print("About to set totalSteps to (newTotalSteps)")
}
didSet {
if totalSteps > oldValue {
print("Added (totalSteps - oldValue) steps")
} }
} }
let stepCounter = StepCounter() stepCounter.totalSteps = 200
// About to set totalSteps to 200 // Added 200 steps stepCounter.totalSteps = 360
// About to set totalSteps to 360 // Added 160 steps stepCounter.totalSteps = 896
// About to set totalSteps to 896 // Added 536 steps
以上代码通过willset和didset观察属性stepCounter步数的变化。 全局变量和局部变量全局变量是在函数、方法、闭包或任何类型之外定义的变量。局部变量是在函数、方法或闭包内部定义的变量。这个跟OC和C的概念差不多,就不多说了。 类型属性实例的属性属于一个特定类型实例,每次类型实例化后都拥有自己的一套属性值,实例之间的属性相互独立。 类型属性语法类型属性是作为类型定义的一部分写在类型最外层的花括号内,因此它的作用范围也就 在类型支持的范围内。使用关键字 static 来定义类型属性 获取和设置类型属性的值类型属性的访问也是通过点运算符来进行,但是,类型属性是通过类型本身来获取和设置,而不是通过实例。 初学笔记,仅供参考,不喜勿喷,欢迎完善交流! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |