Swift教程之方法

方法

方法是與特定類型相關(guān)聯(lián)的函數(shù)。類素跺、結(jié)構(gòu)體和枚舉都可以定義實(shí)例方法,這些方法封裝了特定任務(wù)和功能來處理給定類型的實(shí)例,也可以定義與類型本身相關(guān)聯(lián)的類型方法(類似于Objective-C中的類方法)疲牵。

<br />

實(shí)例方法

實(shí)例方法是屬于特定類、結(jié)構(gòu)體或枚舉的實(shí)例的函數(shù)榆鼠。通過提供訪問和修改實(shí)例屬性的方法纲爸,或通過提供與實(shí)例的目的相關(guān)的功能來支持這些實(shí)例的函數(shù),實(shí)例方法與函數(shù)具有完全相同的語法妆够。

實(shí)例方法具有對(duì)該類型的所有其他實(shí)例方法和屬性的隱式訪問识啦,且只能在其所屬類型的特定實(shí)例上調(diào)用實(shí)例方法负蚊,若沒有現(xiàn)有的實(shí)例,則不能被單獨(dú)調(diào)用颓哮。

class Counter {
    var count = 0
    func increment() {
        count += 1
    }
    func increment(by amount: Int) {
        count += amount
    }
    func reset() {
        count = 0
    }
}

let counter = Counter()
// the initial counter value is 0
counter.increment()
// the counter's value is now 1
counter.increment(by: 5)
// the counter's value is now 6
counter.reset()
// the counter's value is now 0

self屬性

類型的實(shí)例都有一個(gè)self的隱式屬性家妆,它與實(shí)例本身完全相同。

上述increment()方法修改如下:

func increment() {
    self.count += 1
}

在代碼中不需要顯示書寫self冕茅,Swift會(huì)假定在使用當(dāng)前屬性或方法名稱時(shí)指向當(dāng)前實(shí)例的屬性或方法伤极。

當(dāng)實(shí)例方法的參數(shù)名與該實(shí)例的屬性名相同時(shí),有必要使用self屬性來區(qū)分參數(shù)名和屬性名嵌赠。

struct Point {
    var x = 0.0, y = 0.0
    func isToTheRightOf(x: Double) -> Bool {
        return self.x > x
    }
}
let somePoint = Point(x: 4.0, y: 5.0)
if somePoint.isToTheRightOf(x: 1.0) {
    print("This point is to the right of the line where x == 1.0")
}
// Prints "This point is to the right of the line where x == 1.0"

若沒有書寫self前綴塑荒,Swift會(huì)假設(shè)兩個(gè)x都是x的方法參數(shù)。

在實(shí)例方法中修改值類型

由于結(jié)構(gòu)體和枚舉是值類型姜挺,默認(rèn)情況下齿税,不能從其實(shí)例方法修改值類型的屬性。

使用mutating修飾符可以修改特定方法的結(jié)構(gòu)體或枚舉的屬性炊豪,mutating關(guān)鍵字放在func關(guān)鍵字之前:

struct Point {
    var x = 0.0, y = 0.0
    mutating func moveBy(x deltaX: Double, y deltaY: Double) {
        x += deltaX
        y += deltaY
    }
}
var somePoint = Point(x: 1.0, y: 1.0)
somePoint.moveBy(x: 2.0, y: 3.0)
print("The point is now at (\(somePoint.x), \(somePoint.y))")
// Prints "The point is now at (3.0, 4.0)"

不能在結(jié)構(gòu)體類型常量上調(diào)用mutating方法凌箕,因?yàn)槠鋵傩圆荒芨摹?/p>

let fixedPoint = Point(x: 3.0, y: 3.0)
fixedPoint.moveBy(x: 2.0, y: 3.0)
// this will report an error

在mutating方法中分配self

mutating方法可以為隱式self屬性分配一個(gè)全新的實(shí)例。

struct Point {
    var x = 0.0, y = 0.0
    mutating func moveBy(x deltaX: Double, y deltaY: Double) {
        self = Point(x: x + deltaX, y: y + deltaY)
    }
}

枚舉的mutating方法可以將隱式self屬性設(shè)置為與同一枚舉不同的情況:

enum TriStateSwitch {
    case off, low, high
    mutating func next() {
        switch self {
        case .off:
            self = .low
        case .low:
            self = .high
        case .high:
            self = .off
        }
    }
}
var ovenLight = TriStateSwitch.low
ovenLight.next()
// ovenLight is now equal to .high
ovenLight.next()
// ovenLight is now equal to .off

<br />

類型方法

類型方法是定義在類型本身上調(diào)用的方法词渤。通過在方法的func關(guān)鍵字前編寫static關(guān)鍵字來指示類型方法牵舱,也可以使用class關(guān)鍵字允許子類重寫超類的該方法的實(shí)現(xiàn)。

在類型上使用點(diǎn)語法調(diào)用類型方法缺虐,而不是該類型的實(shí)例:

class SomeClass {
    class func someTypeMethod() {
        // type method implementation goes here
    }
}
SomeClass.someTypeMethod()

在類型方法體內(nèi)芜壁,隱式self屬性指類型本身,而不是該類型的實(shí)例高氮,可以使用self來消除類型屬性和類型方法參數(shù)之間的歧義慧妄。

struct LevelTracker {
    static var highestUnlockedLevel = 1
    var currentLevel = 1
    
    static func unlock(_ level: Int) {
        if level > highestUnlockedLevel { 
        highestUnlockedLevel = level 
        }
    }
    
    static func isUnlocked(_ level: Int) -> Bool {
        return level <= highestUnlockedLevel
    }
    
    @discardableResult
    mutating func advance(to level: Int) -> Bool {
        if LevelTracker.isUnlocked(level) {
            currentLevel = level
            return true
        } else {
            return false
        }
    }
}

class Player {
    var tracker = LevelTracker()
    let playerName: String
    func complete(level: Int) {
        LevelTracker.unlock(level + 1)
        tracker.advance(to: level + 1)
    }
    init(name: String) {
        playerName = name
    }
}

var player = Player(name: "Argyrios")
player.complete(level: 1)
print("highest unlocked level is now \(LevelTracker.highestUnlockedLevel)")
// Prints "highest unlocked level is now 2"

player = Player(name: "Beto")
if player.tracker.advance(to: 6) {
    print("player is now on level 6")
} else {
    print("level 6 has not yet been unlocked")
}
// Prints "level 6 has not yet been unlocked"
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市剪芍,隨后出現(xiàn)的幾起案子塞淹,更是在濱河造成了極大的恐慌,老刑警劉巖罪裹,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饱普,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡状共,警方通過查閱死者的電腦和手機(jī)套耕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來口芍,“玉大人箍铲,你說我怎么就攤上這事△尥郑” “怎么了颠猴?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)小染。 經(jīng)常有香客問我翘瓮,道長(zhǎng),這世上最難降的妖魔是什么裤翩? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任资盅,我火速辦了婚禮,結(jié)果婚禮上踊赠,老公的妹妹穿的比我還像新娘呵扛。我一直安慰自己,他們只是感情好筐带,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布今穿。 她就那樣靜靜地躺著,像睡著了一般伦籍。 火紅的嫁衣襯著肌膚如雪蓝晒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天帖鸦,我揣著相機(jī)與錄音芝薇,去河邊找鬼。 笑死作儿,一個(gè)胖子當(dāng)著我的面吹牛洛二,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播攻锰,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼晾嘶,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了口注?” 一聲冷哼從身側(cè)響起变擒,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寝志,沒想到半個(gè)月后娇斑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡材部,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年毫缆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乐导。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡苦丁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出物臂,到底是詐尸還是另有隱情旺拉,我是刑警寧澤产上,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站蛾狗,受9級(jí)特大地震影響晋涣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沉桌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一谢鹊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧留凭,春花似錦佃扼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挎扰,卻和暖如春翠订,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背遵倦。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工尽超, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人梧躺。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓似谁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親掠哥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子巩踏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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