Swift4 Properties

Properties 屬性作為一種組織的成員诺核,在 Swift 中可容納其的組織范圍被擴(kuò)充為類、結(jié)構(gòu)體若专、枚舉许蓖、協(xié)議。得益于Swift的構(gòu)建方式调衰,可以說(shuō)任何類型都可以有屬性膊爪。

基本概念

struct Cat {
    let age: String
    let color: String
}

// Cat 擁有兩個(gè)屬性,age 窖式、color蚁飒,這意味著每一個(gè)Cat的實(shí)例都會(huì)擁有它們。

關(guān)于屬性萝喘,有兩個(gè)類型:

  • 存儲(chǔ)型屬性 stored properties
    實(shí)例會(huì)存儲(chǔ)屬性值淮逻,有內(nèi)存開(kāi)銷琼懊。

    // eg.:
    struct Person {
      var fullName: String
      var email: String
    }
    
    //初始化屬性值,要知道Swift會(huì)根據(jù)結(jié)構(gòu)體的屬性自動(dòng)創(chuàng)建構(gòu)造方法爬早。
    var person = Person(fullName: "Grace Murray",email: "grace@126.com")
    
    //訪問(wèn)屬性
    let name = person.fullName // Grace Murray
    let email = person.email // grace@126.com
    
    //Grace女士 嫁給了 Hopper先生
    person.fullName = "Grace Hopper" //修改屬性值
    let grace = person.fullName // Grace Hopper
    
    //---- 類型聲明
    //如果你不希望外部修改屬性email哼丈,可以修改結(jié)構(gòu)體中email的類型為let.
    struct Person {
      var fullName: String
      let email: String
    }  
    
    //---- 默認(rèn)值
    //如果希望給某個(gè)屬性設(shè)置默認(rèn)值,可以聲明時(shí)賦予筛严。
    struct Person {
      var fullName: String
      var email: String
      var country = "China"
    }
    
    /*
    注意醉旦,Swift 自動(dòng)創(chuàng)建的構(gòu)造方法并不會(huì)考慮是否有默認(rèn)值,所以生成實(shí)例的方法還是一樣的桨啃。
    country 依然需要指定值
    */
      var person = Person(fullName: "Grace Murray",email: "grace@126.com" country: "China")
    
    

  • 計(jì)算型屬性 computed properties
    實(shí)例不會(huì)存儲(chǔ)屬性值车胡,無(wú)內(nèi)存開(kāi)銷。

    struct TV {
      var height: Double
      var width: Double
      
      //計(jì)算型屬性照瘾,可以是常量或變量 
      var diagonal: Int {
          let result = (height * height + width * width).squareRoot().rounded()
          return Int(result)
      }
    }
    

從上面的示例中可以看到匈棘,diagonal 屬性值其實(shí)是關(guān)聯(lián)了 heightwidth 兩個(gè)屬性值計(jì)算而來(lái)析命,而且其并沒(méi)有存儲(chǔ)任何值主卫。
進(jìn)一步來(lái)講,計(jì)算型屬性的狀態(tài)是與其它屬性相關(guān)的鹃愤。


存取方法 (Getter and setter)

上面的例子中計(jì)算型屬性 diagonal 可以被稱為read-only(只讀的)簇搅。其中的代碼塊叫做getter(取)软吐,當(dāng)然我們也可以創(chuàng)建一個(gè)可讀瘩将、可寫的計(jì)算型屬性。他會(huì)包含兩個(gè)方法关噪,setter(存) 鸟蟹、getter(取)使兔。

var diagonal: Int {
    //取
    get {
        let result = (height * height + width * width).squareRoot().rounded()
        return Int(result)
    }

    //存
    set {
        //定義 16:9
        let ratioWidth = 16.0
        let ratioHeight = 9.0
        
        let ratioDiagonal =
      (ratioWidth * ratioWidth + ratioHeight * ratioHeight).squareRoot()
        
        //注意setter方法,這里間接影響了height藤韵、width 屬性值虐沥。
        height = Double(newValue) * ratioHeight / ratioDiagonal
        width = height * ratioWidth / ratioHeight
    }
}

相對(duì)來(lái)說(shuō),存取方法對(duì)計(jì)算型屬性具有更大的意義泽艘。你可以在適當(dāng)暴露出一個(gè)計(jì)算型屬性欲险,然后通過(guò)它去影響一個(gè)實(shí)例的其它屬性或狀態(tài)。


類型屬性 (Type properties)

之前講到的屬性匹涮,是歸屬于類型實(shí)例(Instance)的天试。事實(shí)上類型也是可以擁有屬性的,那么如果我們想定義一個(gè)歸屬于類型(Type)的屬性然低,該怎樣做呢喜每?

//需要用到的關(guān)鍵詞 static

struct BasketBall {
    //類型屬性
    static var made = "China"
    
    //實(shí)例屬性
    var owner: String
    let color: String
    
    //計(jì)算性屬性
    var description {
        return owner + "favorite" + color
    }
}
  • 調(diào)用類型屬性
//通過(guò)類型名調(diào)用
let placeOfProduction = BasketBall.description //China

使用類型屬性务唐,意味著你可以在任意的地方訪問(wèn)存儲(chǔ)在類型中的屬性值,而無(wú)需生成實(shí)例带兜。


屬性觀察者 (Property observers)

Swift提供了觀察屬性值改變的方法枫笛,被稱為屬性觀察者。
常用的有 didSet刚照、willSet刑巧,但需要特別注意的是這兩個(gè)方法只對(duì)存儲(chǔ)型變量有效。

  • willSet observer 在屬性改變時(shí)觸發(fā)
  • didSet observer 在屬性改變后觸發(fā)
struct Level {
//類型屬性
static var highestLevel = 1

//實(shí)例屬性
let id: Int
var boss: String
var unlocked: Bool {
    //注意无畔,和setter 啊楚、getter方法很像,但不是一回事
    didSet {
        //可以訪問(wèn)其它屬性
        if unlocked && id > Level.highestLevel {
            Level.highestLevel = id
         }
     }
  }
}

Tip:在屬性初始化期間浑彰,是不會(huì)觸發(fā)觀察者方法的特幔。它們只會(huì)在為一個(gè)完全初始化的實(shí)例,賦新值的時(shí)候觸發(fā)闸昨。

  • 限制變量
struct LightBulb {
    static let maxCurrent = 40
    var current = 0 {
        didSet {
        if current > LightBulb.maxCurrent {
            print("too hight")
            //oldValue 方法內(nèi)部隱藏的舊值
            //newValue 方法內(nèi)部隱藏的新值
            current = oldValue
        }
        }
    }
}

懶加載 (Lazy properties)

屬性懶加載提供了一種節(jié)省內(nèi)存和提升效率的新方式蚯斯,注意適用于存儲(chǔ)型屬性且被聲明為變量 var

  • 語(yǔ)法
Struct Circle {
    //關(guān)鍵字 lazy  閉包形式饵较,代碼塊只會(huì)執(zhí)行一次
    //這里 pi 是一個(gè)存儲(chǔ)型屬性
    lazy var pi = {
        return ((4.0 * atan(1.0 / 5.0)) - atan(1.0 / 239.0)) * 4.0 
        }()
    
    var radius = 0.0
    
    //計(jì)算型屬性
    //mutating 用來(lái)標(biāo)記對(duì)結(jié)構(gòu)體的更改
    var circumference : Double {
        mutating get {
            return pi * radius * 2
        }
    }
    init(radius: Double) {
        self.radius = radius
    }
}

/*
應(yīng)當(dāng)注意拍嵌,懶加載適用于 var 變量,雖然它的代碼塊只會(huì)運(yùn)行一次循诉。
但是横辆,在最初它是處于無(wú)值狀態(tài)的。
只有在第一次使用時(shí)茄猫,才會(huì)被初始化狈蚤。
*/

Tip:懶加載對(duì)象,存儲(chǔ)型屬性且被聲明為為變量划纽。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末脆侮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子勇劣,更是在濱河造成了極大的恐慌靖避,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件比默,死亡現(xiàn)場(chǎng)離奇詭異幻捏,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)命咐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門篡九,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人醋奠,你說(shuō)我怎么就攤上這事榛臼∫恋瑁” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵讽坏,是天一觀的道長(zhǎng)锭魔。 經(jīng)常有香客問(wèn)我,道長(zhǎng)路呜,這世上最難降的妖魔是什么迷捧? 我笑而不...
    開(kāi)封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮胀葱,結(jié)果婚禮上漠秋,老公的妹妹穿的比我還像新娘。我一直安慰自己抵屿,他們只是感情好庆锦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著轧葛,像睡著了一般搂抒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尿扯,一...
    開(kāi)封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天求晶,我揣著相機(jī)與錄音,去河邊找鬼衷笋。 笑死芳杏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辟宗。 我是一名探鬼主播爵赵,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼泊脐!你這毒婦竟也來(lái)了空幻?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤晨抡,失蹤者是張志新(化名)和其女友劉穎氛悬,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體耘柱,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年棍现,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了调煎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡己肮,死狀恐怖士袄,靈堂內(nèi)的尸體忽然破棺而出悲关,到底是詐尸還是另有隱情,我是刑警寧澤娄柳,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布寓辱,位于F島的核電站,受9級(jí)特大地震影響赤拒,放射性物質(zhì)發(fā)生泄漏秫筏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一挎挖、第九天 我趴在偏房一處隱蔽的房頂上張望这敬。 院中可真熱鬧,春花似錦蕉朵、人聲如沸崔涂。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)冷蚂。三九已至,卻和暖如春汛闸,著一層夾襖步出監(jiān)牢的瞬間蝙茶,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工蛉拙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尸闸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓孕锄,卻偏偏與公主長(zhǎng)得像吮廉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子畸肆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

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