Swift计算属性
除存储属性外,类、结构体和枚举可以定义计算属性,计算属性不直接存储值,而是提供一个 getter 来获取值,一个可选的 setter 来间接设置其他属性或变量的值。
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)
let centerY = origin.y + (size.height / 2)
return Point(x: centerX, y: centerY)
}
set(newCenter) {
origin.x = newCenter.x - (size.width / 2)
origin.y = newCenter.y - (size.height / 2)
}
}
}
var square = Rect(origin: Point(x: 0.0, y: 0.0),
size: Size(width: 10.0, height: 10.0))
let initialSquareCenter = square.center
square.center = Point(x: 15.0, y: 15.0)
println("square.origin is now at (\(square.origin.x), \(square.origin.y))")
// 输出 "square.origin is now at (10.0, 10.0)”
这个例子定义了 3 个几何形状的结构体:
Point
封装了一个(x, y)
的坐标Size
封装了一个width
和height
Rect
表示一个有原点和尺寸的矩形
Rect
也提供了一个名为center
的计算属性。一个矩形的中心点可以从原点和尺寸来算出,所以不需要将它以显式声明的Point
来保存。Rect
的计算属性center
提供了自定义的 getter 和 setter 来获取和设置矩形的中心点,就像它有一个存储属性一样。
例子中接下来创建了一个名为square
的Rect
实例,初始值原点是(0, 0)
,宽度高度都是10
。如图所示蓝色正方形。
square
的center
属性可以通过点运算符(square.center
)来访问,这会调用 getter 来获取属性的值。跟直接返回已经存在的值不同,getter 实际上通过计算然后返回一个新的Point
来表示square
的中心点。如代码所示,它正确返回了中心点(5, 5)
。
center
属性之后被设置了一个新的值(15, 15)
,表示向右上方移动正方形到如图所示橙色正方形的位置。设置属性center
的值会调用 setter 来修改属性origin
的x
和y
的值,从而实现移动正方形到新的位置。
便捷 setter 声明
如果计算属性的 setter 没有定义表示新值的参数名,则可以使用默认名称newValue
。下面是使用了便捷 setter 声明的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 的计算属性就是只读计算属性。只读计算属性总是返回一个值,可以通过点运算符访问,但不能设置新的值。
<<<<<<< HEAD
注意:必须使用
var
关键字定义计算属性,包括只读计算属性,因为他们的值不是固定的。let
关键字只用来声明常量属性,表示初始化后再也无法修改的值。注意:
必须使用
var
关键字定义计算属性,包括只读计算属性,因为它们的值不是固定的。let
关键字只用来声明常量属性,表示初始化后再也无法修改的值。a516af6a531a104ec88da0d236ecf389a5ec72af
只读计算属性的声明可以去掉get
关键字和花括号:
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)
println("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volume)")
// 输出 "the volume of fourByFiveByTwo is 40.0"
这个例子定义了一个名为Cuboid
的结构体,表示三维空间的立方体,包含width
、height
和depth
属性,还有一个名为volume
的只读计算属性用来返回立方体的体积。设置volume
的值毫无意义,因为通过width
、height
和depth
就能算出volume
。然而,Cuboid
提供一个只读计算属性来让外部用户直接获取体积是很有用的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2015-10-11 Swift之贪婪的UIButton
2015-10-11 Swift学习之UI开发初探