swift基礎(chǔ)-20-方法

隸屬于每一個(gè)類(lèi)或結(jié)構(gòu)體的函數(shù)稱(chēng)之為方法:
方法分為類(lèi)方法和實(shí)例方法, 對(duì)應(yīng)OC中的 + - 方法
實(shí)例方法:實(shí)例方法一定是通過(guò)對(duì)象來(lái)調(diào)用的, 實(shí)例方法隸屬于某一個(gè)類(lèi)

class Person {
    var _name:String = "solozyx"
    var _age:Int = 99
    // 實(shí)例方法一定是通過(guò)對(duì)象來(lái)調(diào)用的, 實(shí)例方法隸屬于某一個(gè)類(lèi)
    // func setName(name:String, age:Int)
    // 如果不希望某個(gè)參數(shù)作為外部參數(shù), 可以在參數(shù)前面加上_, 忽略外部參數(shù)
    func setName(name:String, _ age:Int)
    {
        _name = name
        _age = age
    }
    func show()
    {
        print("name = \(_name) age = \(_age)")
    }
}

var p = Person()
// 由于第一個(gè)參數(shù)可以通過(guò)方法名稱(chēng)指定, 所以默認(rèn)第一個(gè)參數(shù)不作為外部參數(shù)
//p.setName("zs", age: 88) // 錯(cuò)誤
p.setName("zs", 88)

//func setName(name:String, age:Int){
//func setName(name:String,myAge age:Int){
func setName(name:String, age:Int){
    
}
// 實(shí)例方法和函數(shù)的區(qū)別在于, 實(shí)例方法會(huì)自動(dòng)將除第一個(gè)參數(shù)以外的其它參數(shù)即當(dāng)做外部參數(shù)又當(dāng)做內(nèi)部參數(shù), 而函數(shù)需要我們自己指定才會(huì)有外部參數(shù), 默認(rèn)沒(méi)有
setName("ls", age:55)

self關(guān)鍵字, Swift中的self和OC中的self基本一樣. self指當(dāng)前對(duì)象, 如果self在對(duì)象方法中代表當(dāng)前對(duì)象. 但是在類(lèi)方法中沒(méi)有self

class Person2 {
   var name:String = "solozyx"
   var age:Int = 99
   // 當(dāng)參數(shù)名稱(chēng)和屬性名稱(chēng)一模一樣時(shí), 無(wú)法區(qū)分哪個(gè)是參數(shù)哪個(gè)是屬性, 這個(gè)時(shí)候可以通過(guò)self明確的來(lái)區(qū)分參數(shù)和屬性
   func setName(name:String, age:Int)
   {
       // 默認(rèn)情況下, _name和_age前面有一個(gè)默認(rèn)的self關(guān)鍵字, 因?yàn)樗凶兞慷夹枰榷x再使用, 而setName方法中并沒(méi)有定義過(guò)_name和_age, 而是在屬性中定義的, 所以setName中訪問(wèn)的其實(shí)是屬性, 編譯器默認(rèn)幫我們?cè)谇懊婕恿艘粋€(gè)self.
       // _name = name
       // _age = age
       self.name = name
       self.age = age
   }
   func show()
   {
       print("name = \(name) age = \(age)")
   }
}

mutating方法
值類(lèi)型(結(jié)構(gòu)體和枚舉)默認(rèn)方法是不可以修改屬性的, 如果需要修改屬性, 需要在方法前加上mutating關(guān)鍵字, 讓該方法變?yōu)橐粋€(gè)改變方法

struct Person3 {
    var name:String = "solozyx"
    var age:Int = 99
    // 值類(lèi)型(結(jié)構(gòu)體和枚舉)默認(rèn)方法是不可以修改屬性的, 如果需要修改屬性, 需要在方法前加上mutating關(guān)鍵字, 讓該方法變?yōu)橐粋€(gè)改變方法
    // 注意: 類(lèi)不需要, 因?yàn)轭?lèi)的實(shí)例方法默認(rèn)就可以修改
    mutating func setName(name:String, age:Int)
    {
        self.name = name
        self.age = age
    }
    func show()
    {
        print("name = \(name) age = \(age)")
    }
}
var p3 = Person3()
p3.setName("zs", age: 99)
p3.show()
enum LightSwitch{
    case OFF, ON
    mutating func next()
    {
        switch self{
        case OFF:
            self = ON
        case ON:
            self = OFF
        }
    }
}
var ls:LightSwitch = LightSwitch.OFF
if ls == LightSwitch.OFF
{
    print("off")
}
ls.next()
if ls == LightSwitch.ON
{
    print("on")
}
struct Person4 {
    var name:String = "solozyx"
    static var card: String = "123456"
    func show()
    {
        print("name = \(self.name) card = \(Person4.card)")
    }
    static func staticShow()
    {
        // 類(lèi)方法中沒(méi)有self
        // print("name = \(self.name) card = \(Person.card)")
        
        // 靜態(tài)方法對(duì)應(yīng)OC中的+號(hào)方法, 和OC一樣在類(lèi)方法中不能訪問(wèn)非靜態(tài)屬性
        print("card = \(Person4.card)")
    }
}
var p4 = Person4()
p4.show()
Person4.staticShow()
class Person5 {
    var name:String = "solozyx"
    class var card: String {
        return "123456"
    }
    func show()
    {
        print("name = \(self.name) card = \(Person5.card)")
    }
    class func staticShow()
    {
        // 類(lèi)方法中沒(méi)有self
        // print("name = \(self.name) card = \(Person.card)")
        // 靜態(tài)方法對(duì)應(yīng)OC中的+號(hào)方法, 和OC一樣在類(lèi)方法中不能訪問(wèn)非靜態(tài)屬性
        print("card = \(Person5.card)")
    }
}
var p5 = Person5()
p5.show()
Person5.staticShow()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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