-
概念介绍
- 结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合
- 结构体(struct)指的是一种数据结构
- 结构体是值类型,在方法中传递时是值传递
结构的定义格式
struct 结构体名称 {
// 属性和方法
}
结构体的作用
- 先来看一个例子
- 我们要计算平面坐标里某个点距点Center的距离是否小于200
-
算起来很简单,勾股定理就搞定了:
* 其中sqrt(n)用来计算n的平方根
* pow(x, n)用来计算x的n次方
let centerX : Double = 100
let centerY : Double = 100
func inRange(x : Double, y : Double) -> Bool {
let disX = x - centerX
let disY = y - centerX
let dis = sqrt(pow(disX, 2) + pow(disY, 2))
return dis < 200
}
let x : Double = 100
let y : Double = 1000
inRange(x, y: y)
- 问题
- 但是这样有一个不足,当我们需要比较很多个点和Center的距离的时候,这些数字并不能明确告诉我们它们代表的位置的意义,甚至我们都无法知道它们代表一个数字。
- 如果我们可以像这样来比较位置:
- 相比数字,它们看上去就会直观的多
- 而这,就是我们需要自定义struct类型最直接的原因
inRange(location1)
inRange(myHome)
- 使用结构进行改进
// 初始化结构体
struct Location {
var x : Double
var y : Double
}
// 创建结构体
let location = Location(x: 90, y: 90)
// 优化刚才的方法
func inRange(location : Location) -> Bool {
let disX = location.x - centerX
let disY = location.y - centerY
let dis = sqrt(pow(disX, 2) + pow(disY, 2))
return dis < 200
}
inRange(location)
结构体的增强
- 扩充构造函数
- 默认情况下创建Location时使用Location(x: x值, y: y值)
- 但是为了让我们在使用结构体时更加的灵活,swift还可以对构造函数进行扩充
- 扩充的注意点
- 在扩充的构造函数中必须保证成员变量是有值的
- 扩充的构造函数会覆盖原有的构造函数
struct Location {
var x : Double
var y : Double
init(x : Double, y : Double) {
self.x = x
self.y = y
}
init(xyString : String) {
let strs = xyString.componentsSeparatedByString(",")
x = Double(strs.first!)!
y = Double(strs.last!)!
}
}
let location = Location(x: 100, y: 100)
let location1 = Location(xyString: "100,100")
- 为结构体扩充方法
- 为了让结构体使用更加灵活,swift的结构体中可以扩充方法
- 例子:为了Location结构体扩充两个方法
- 向水平方向移动的方法
- 向垂直方向移动的方法
struct Location {
var x : Double
var y : Double
init(x : Double, y : Double) {
self.x = x
self.y = y
}
init(xyString : String) {
let strs = xyString.componentsSeparatedByString(",")
x = Double(strs.first!)!
y = Double(strs.last!)!
}
mutating func moveH(x : Double) {
self.x += x
}
mutating func moveV(y : Double) {
self.y += y
}
}
- 注意:
- 如果我们使用的Location不是自己定义的,但是我们仍旧希望在自己的项目里扩展Location的操作
- Swift也能帮我们达成,这个机制,叫做extension;extension也可以给系统的类实现扩展
extension Location {
mutating func moveH(x : Double) {
self.x += x
}
mutating func moveV(y : Double) {
self.y += y
}
}