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)體是值類型,在方法中傳遞時(shí)是值傳遞
  • 結(jié)構(gòu)的定義格式

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

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

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


      screenshot.png
    * 其中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
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末提陶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子匹层,更是在濱河造成了極大的恐慌隙笆,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件升筏,死亡現(xiàn)場(chǎng)離奇詭異撑柔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)您访,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門铅忿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人灵汪,你說我怎么就攤上這事檀训「塘剩” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵肢扯,是天一觀的道長(zhǎng)妒茬。 經(jīng)常有香客問我,道長(zhǎng)蔚晨,這世上最難降的妖魔是什么乍钻? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘孤里。我一直安慰自己,他們只是感情好浩考,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著被盈,像睡著了一般析孽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上只怎,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天袜瞬,我揣著相機(jī)與錄音,去河邊找鬼身堡。 笑死邓尤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贴谎。 我是一名探鬼主播汞扎,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼擅这!你這毒婦竟也來了澈魄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤仲翎,失蹤者是張志新(化名)和其女友劉穎痹扇,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谭确,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帘营,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年票渠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逐哈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡问顷,死狀恐怖昂秃,靈堂內(nèi)的尸體忽然破棺而出禀梳,到底是詐尸還是另有隱情,我是刑警寧澤肠骆,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布算途,位于F島的核電站,受9級(jí)特大地震影響蚀腿,放射性物質(zhì)發(fā)生泄漏嘴瓤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一莉钙、第九天 我趴在偏房一處隱蔽的房頂上張望廓脆。 院中可真熱鬧,春花似錦磁玉、人聲如沸停忿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)席赂。三九已至,卻和暖如春时迫,著一層夾襖步出監(jiān)牢的瞬間颅停,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工别垮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留便监,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓碳想,卻偏偏與公主長(zhǎng)得像烧董,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子胧奔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容