Swift基礎(chǔ)-結(jié)構(gòu)體

  • 概念介紹

    • 結(jié)構(gòu)體(struct)是由一系列具有相同類型或不同類型的數(shù)據(jù)構(gòu)成的數(shù)據(jù)集合
    • 結(jié)構(gòu)體(struct)指的是一種數(shù)據(jù)結(jié)構(gòu)
    • 結(jié)構(gòu)體是值類型,在方法中傳遞時是值傳遞
  • 結(jié)構(gòu)的定義格式

struct 結(jié)構(gòu)體名稱 {
    // 屬性和方法
}

結(jié)構(gòu)體的作用

  • 先來看一個例子
    • 我們要計算平面坐標(biāo)里某個點距點Center的距離是否小于200
    • 算起來很簡單,勾股定理就搞定了:


      screenshot.png
    * 其中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)
  • 問題
    • 但是這樣有一個不足,當(dāng)我們需要比較很多個點和Center的距離的時候,這些數(shù)字并不能明確告訴我們它們代表的位置的意義,甚至我們都無法知道它們代表一個數(shù)字。
    • 如果我們可以像這樣來比較位置:
      • 相比數(shù)字,它們看上去就會直觀的多
      • 而這,就是我們需要自定義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時使用Location(x: x值, y: y值)
    • 但是為了讓我們在使用結(jié)構(gòu)體時更加的靈活,swift還可以對構(gòu)造函數(shù)進(jìn)行擴(kuò)充
    • 擴(kuò)充的注意點
      • 在擴(kuò)充的構(gòu)造函數(shù)中必須保證成員變量是有值的
      • 擴(kuò)充的構(gòu)造函數(shù)會覆蓋原有的構(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ò)充兩個方法
      • 向水平方向移動的方法
      • 向垂直方向移動的方法
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希望在自己的項目里擴(kuò)展Location的操作
    • Swift也能幫我們達(dá)成,這個機(jī)制,叫做extension;extension也可以給系統(tǒng)的類實現(xiàn)擴(kuò)展
extension Location {
    mutating func moveH(x : Double) {
        self.x += x
    }

    mutating func moveV(y : Double) {
        self.y += y
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容