-
概念介紹
- 結(jié)構(gòu)體(struct)是由一系列具有相同類型或不同類型的數(shù)據(jù)構(gòu)成的數(shù)據(jù)集合
- 結(jié)構(gòu)體(struct)指的是一種數(shù)據(jù)結(jié)構(gòu)
- 結(jié)構(gòu)體是值類型,在方法中傳遞時(shí)是值傳遞
結(jié)構(gòu)的定義格式
struct 結(jié)構(gòu)體名稱 {
// 屬性和方法
}
結(jié)構(gòu)體的作用
- 先來看一個(gè)例子
- 我們要計(jì)算平面坐標(biāo)里某個(gè)點(diǎn)距點(diǎn)Center的距離是否小于200
-
算起來很簡(jiǎn)單,勾股定理就搞定了:
* 其中sqrt(n)用來計(jì)算n的平方根
* pow(x, n)用來計(jì)算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)
- 問題
- 但是這樣有一個(gè)不足,當(dāng)我們需要比較很多個(gè)點(diǎn)和Center的距離的時(shí)候硝桩,這些數(shù)字并不能明確告訴我們它們代表的位置的意義路翻,甚至我們都無法知道它們代表一個(gè)數(shù)字椭豫。
- 如果我們可以像這樣來比較位置:
- 相比數(shù)字捌朴,它們看上去就會(huì)直觀的多
- 而這津函,就是我們需要自定義struct類型最直接的原因
inRange(location1)
inRange(myHome)
- 使用結(jié)構(gòu)進(jìn)行改進(jìn)
// 初始化結(jié)構(gòu)體
struct Location {
var x : Double
var y : Double
}
// 創(chuàng)建結(jié)構(gòu)體
let location = Location(x: 90, y: 90)
// 優(yōu)化剛才的方法
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)
結(jié)構(gòu)體的增強(qiáng)
- 擴(kuò)充構(gòu)造函數(shù)
- 默認(rèn)情況下創(chuàng)建Location時(shí)使用Location(x: x值, y: y值)
- 但是為了讓我們?cè)谑褂媒Y(jié)構(gòu)體時(shí)更加的靈活,swift還可以對(duì)構(gòu)造函數(shù)進(jìn)行擴(kuò)充
- 擴(kuò)充的注意點(diǎn)
- 在擴(kuò)充的構(gòu)造函數(shù)中必須保證成員變量是有值的
- 擴(kuò)充的構(gòu)造函數(shù)會(huì)覆蓋原有的構(gòu)造函數(shù)
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")
- 為結(jié)構(gòu)體擴(kuò)充方法
- 為了讓結(jié)構(gòu)體使用更加靈活,swift的結(jié)構(gòu)體中可以擴(kuò)充方法
- 例子:為了Location結(jié)構(gòu)體擴(kuò)充兩個(gè)方法
- 向水平方向移動(dòng)的方法
- 向垂直方向移動(dòng)的方法
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不是自己定義的蛉幸,但是我們?nèi)耘f希望在自己的項(xiàng)目里擴(kuò)展Location的操作
- Swift也能幫我們達(dá)成破讨,這個(gè)機(jī)制,叫做extension奕纫;extension也可以給系統(tǒng)的類實(shí)現(xiàn)擴(kuò)展
extension Location {
mutating func moveH(x : Double) {
self.x += x
}
mutating func moveV(y : Double) {
self.y += y
}
}