Swift 方法(Methods)

Method

  • 方法計算型屬性的使用選取

1.優(yōu)先考慮使用 computed property(計算型屬性) 戏阅,可以利用setter 昼弟、getter方法。
2.如果不需要用到setter/getter奕筐,并且需要處理數(shù)據(jù)庫相關(guān)的復(fù)雜任務(wù)舱痘,那么建議使用方法Method .

struct person {
    var name: String
    
    //很顯然可以使用計算型屬性來代替
    func age() -> Int {
        return 20
    }
}

Tip: 一個返回單一值的方法,顯然沒有什么必要存在离赫。

  • self 介紹

一個結(jié)構(gòu)體定義更像是一張藍圖芭逝,它的實例 Instance 作為一個真實的對象存在。Swift 編譯器默認將self作為一個隱含參數(shù)渊胸,傳遞給了method旬盯。在結(jié)構(gòu)體內(nèi)部,允許使用 self 訪問實例的屬性或方法翎猛。

struct person {
    var name: String
    var age: Int
    
    //這種傳參方式?jīng)]有什么意義
    func description(name: String, age: Int) -> String {
        return "\(name)'s age is \(age)"
    }
}

Tip:換句話說胖翰,一個實例的方法如果訪問的都是自身的屬性,那么將他們作為參數(shù)傳遞以增加函數(shù)的復(fù)雜度是沒有任何意義的切厘。


構(gòu)造函數(shù)

之前提到萨咳,Swift會根據(jù)結(jié)構(gòu)體類型的屬性來自動創(chuàng)建構(gòu)造函數(shù)(包含所有屬性,強制初始化)疫稿,這僅僅是為了保證生成實例時保證所有屬性是可以使用的狀態(tài)培他。

struct Test{
    var name: String
    var age: Int
   /* 
    //這個也被稱為 簡單構(gòu)造函數(shù)
    init() {
        name = "Tom"
        age = 18
    }
    */
    
    ///自定義構(gòu)造函數(shù)
    func init(name: String, age: Int){
    //這里需要注意 
    /*
        //wrong 不要試圖,因為編譯器并不會知道哪個才是本地屬性
        
        name = name 
        age = age 
        
    */
    
    self.name = name
    self.age = age
    }
    
    
    func description() -> String {
        return  name + String(age)
    }    
}

///注意而克,如果上面的構(gòu)造函數(shù)處于注釋狀態(tài)靶壮,
///那么系統(tǒng)就會強制我們使用系統(tǒng)自動創(chuàng)建的構(gòu)造函數(shù)來進行實例生成。
let test = Test(name: <String>, age: <Int>)

///打開注釋员萍,才可以使用已經(jīng)定義好的 init()構(gòu)造函數(shù)腾降,而自動生成的構(gòu)造函數(shù)會變的不可用。
let testA = Test()

Tip:在你決定創(chuàng)建構(gòu)造函數(shù)時碎绎,也就意味著放棄了使用系統(tǒng)為你自動創(chuàng)建好的構(gòu)造函數(shù)螃壤。


  • mutating methods (修改實例屬性會遇到系統(tǒng)的保護屏障)
struct Test{
    var name: String
    var age: Int
    
    init() {
        name = "Tom"
        age = 18
    }
    
    func description() -> String {
        return  name + String(age)
    }
    
    ///修改age 的方法   
    func changeAge() {
        age += 2
    }    
}

可以看到抗果,我們創(chuàng)建了一個方法用來修改屬性age〖榍纾可以一旦編譯冤馏,編譯器會報如下錯誤:

Left side of mutating operator isn't mutable: 'self' is immutable

該錯誤的含義,仿佛是系統(tǒng)在告訴我們self及其屬性在結(jié)構(gòu)體中默認是不可變的寄啼。當(dāng)然逮光,這是不包括構(gòu)造函數(shù)的。顯然墩划,設(shè)計者并不希望我們隨意改變內(nèi)部環(huán)境涕刚。

  • 思考一: 結(jié)構(gòu)體作為系統(tǒng)提供的最基本數(shù)據(jù)類型,在某種程度上其類似于OCNSObject的地位乙帮。
  • 思考二: 足夠微小的基本類型杜漠,應(yīng)該默認是固化的狀態(tài)。
  • 思考三: 內(nèi)部不應(yīng)該含有不直觀的察净、隱藏的狀態(tài)變更
  • 思考四: 結(jié)構(gòu)體是值類型valueType驾茴,copy-on-write
///遵照系統(tǒng)提示,我們會很容易注意到關(guān)鍵字 mutating operator 氢卡,修改如下

mutating func changeAge(){
    age += 2
}

//由于結(jié)構(gòu)體是值類型锈至,當(dāng)期作為參數(shù)傳遞時或者賦值時,默認會發(fā)生拷貝操作译秦。那么如果內(nèi)部存在能夠影響屬性值的方法裹赴,很有可能會導(dǎo)致原結(jié)構(gòu)體和拷貝后的結(jié)構(gòu)體會不一致。

mutating 操作中诀浪,Swift會隱含完成以下步驟:

1.被標記為'mutating'的函數(shù),默認調(diào)用者將不再是固化的延都,也就是常量雷猪,應(yīng)該是一個變量。
2.Swift會悄悄的把傳入的隱含參數(shù)'self',標記為'inout'. 概念上類似于晰房,傳址求摇。
  • 類型方法(Type methods)

和類型屬性(Type properties)一樣,我們也可以自定義類型方法殊者,在類型方法中我們可以訪問全部的類型屬性与境。其實這也是另一種單例形式~ 關(guān)鍵字static

Struct Person {
    static func typeFunc(){
        print("do whatever you want...")
    }
}

//調(diào)用
Person.typeFunc()

  • 為結(jié)構(gòu)體添加擴展(僅限方法、構(gòu)造函數(shù)猖吴、計算型屬性)

同OC中類別Category的概念一樣摔刁,Swift中我們也可以很方便的通過擴展extension為類型添加方法,計算型屬性等海蔽。

extension Person {
    static func typeFuncA() {
        print("添加類型方法")
    }
    
    static var typeComputeProperty:String {
        return "類型計算型屬性"
    }
    
    func instanceFuncA() {
        print("添加實例方法")
    }
    
    var instanceProperty:String {
        return "實例計算型屬性"
    }
    
    init() {
        print("添加了構(gòu)造函數(shù)")
    }
    
    
}

上面的是會成功的情況共屈,那么我們做一些錯誤嘗試绑谣,來看一下編譯器的反應(yīng)。

///保留上面的擴展拗引,新建一個擴展
extension Person {
    /**
     再次添加一個構(gòu)造函數(shù)   
    */
    init() {
        
    }
    //編譯器報錯 Invalid redeclaration of 'init()'
    
    /**
    添加一個已有的方法
    */
    func instanceFuncA() {
        print("添加實例方法")
    }  
    //編譯器報錯 note: 'emptyFunc()' previously declared 
    
    //那么 復(fù)寫呢
    override func instanceFuncA() {
        print("添加實例方法")
    }
    //結(jié)果還是一樣的警告借宵,感興趣的可以試一下復(fù)寫屬性等等
    
}

能夠基本得出的結(jié)論,Swift 分類中是不能復(fù)寫類型中已有的函數(shù)矾削、屬性的壤玫。這種限制也很合理,畢竟是不安全的行為哼凯。

還有一個有趣的現(xiàn)象欲间,上面已經(jīng)講過當(dāng)你為類型實現(xiàn)了構(gòu)造函數(shù)時,就默認放棄了系統(tǒng)自動生成的構(gòu)造函數(shù)的權(quán)利挡逼。不過括改,通過類別,我們可以做到讓自定義的構(gòu)造函數(shù)和自動構(gòu)造函數(shù)同時可用家坎。

struct Test{
    var varA:String
    var varB:String
}
//可用
Test(varA: "A",varB: "B")

extension Test{
    init(){
        varA = "A"
        varB = "B"
    }
}

//同時可用
Test()
Test(varA: "A",varB: "B")

在這里給自己留一個問題嘱能,為什么Swift不可以添加存儲型屬性?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末虱疏,一起剝皮案震驚了整個濱河市惹骂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌做瞪,老刑警劉巖对粪,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異装蓬,居然都是意外死亡著拭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門牍帚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來儡遮,“玉大人,你說我怎么就攤上這事暗赶”杀遥” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵蹂随,是天一觀的道長十嘿。 經(jīng)常有香客問我,道長岳锁,這世上最難降的妖魔是什么绩衷? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上唇聘,老公的妹妹穿的比我還像新娘版姑。我一直安慰自己,他們只是感情好迟郎,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布剥险。 她就那樣靜靜地躺著,像睡著了一般宪肖。 火紅的嫁衣襯著肌膚如雪表制。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天控乾,我揣著相機與錄音么介,去河邊找鬼。 笑死蜕衡,一個胖子當(dāng)著我的面吹牛壤短,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播慨仿,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼久脯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了镰吆?” 一聲冷哼從身側(cè)響起帘撰,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤脾歧,失蹤者是張志新(化名)和其女友劉穎秧秉,沒想到半個月后炼团,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粮宛,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年瓢宦,在試婚紗的時候發(fā)現(xiàn)自己被綠了斥季。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锦溪。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡减余,死狀恐怖婆赠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情佳励,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布蛆挫,位于F島的核電站赃承,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏悴侵。R本人自食惡果不足惜瞧剖,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抓于,春花似錦做粤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至巾遭,卻和暖如春肉康,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背灼舍。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工吼和, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人骑素。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓炫乓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親献丑。 傳聞我的和親對象是個殘疾皇子末捣,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

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