Swift3.x 方法(Methods) ???

結(jié)構(gòu)體和枚舉能夠定義方法是 Swift 與 C/Objective-C 的主要區(qū)別之一。在 Objective-C 中,類是唯一能定義方法的類型。但在 Swift 中,你不僅能選擇是否要定義一個類/結(jié)構(gòu)體/枚舉,還能靈活的在你創(chuàng)建的類型(類/結(jié)構(gòu)體/枚舉)上定義方法。

? ?實(shí)例方法

實(shí)例方法是屬于某個特定類、結(jié)構(gòu)體或者枚舉類型實(shí)例的方法。實(shí)例方法提供訪問和修改實(shí)例屬性的方法或提供與實(shí)例目的相關(guān)的功能,并以此來支撐實(shí)例的功能。實(shí)例方法的語法與函數(shù)完全一致.

實(shí)例方法要卸載它所屬的類型的前后大括號之間.實(shí)例方法能夠隱式訪問它所屬類型的所有的其他實(shí)例方法和屬性,實(shí)例方法只能被它所屬的類的某個特定實(shí)例調(diào)用.實(shí)例方法不能脫離于現(xiàn)存的實(shí)例而被調(diào)用.

/*

//MARK: -- self屬性(The self Property)

*/

struct ?Point {

var x = 0.0, y = 0.0

func ? isToTheRightOfx(x: Double) -> Bool {

return ?self.x > x //只有在實(shí)例方法的某個參數(shù)名和實(shí)例的某個屬性名稱相同的時候參數(shù)名有優(yōu)先權(quán),此時必須使用self.x > x ,來區(qū)分屬性名和參數(shù)名,如果該情況下不使用self,Swift就會認(rèn)為兩次使用的x都值得是名稱為x的函數(shù)參數(shù)

}

}


//MARK: -- 在實(shí)例方法中修改值類型

//結(jié)構(gòu)體和枚舉是值類型。一般情況下,值類型的屬性不能在它的實(shí)例方法中被修改。但是,如果你確實(shí)需要在某個具體的方法中修改結(jié)構(gòu)體或者枚舉的屬性,你可以選擇變異(mutating)這個方法,然后方法就可以從方法內(nèi)部改變它的屬性;并且它做的任何改變在方法結(jié)束時還會保留在原始結(jié)構(gòu)中。方法還可以給它隱含的self屬性賦值一個全新的實(shí)例,這個新實(shí)例在方法結(jié)束后將替換原來的實(shí)例。

struct Point2 {

var x = 0.0, y = 0.0

mutating func moveByx(deltaX: Double, y deltaY: Double) {

x += deltaX

y += deltaY

//變異方法能夠賦值給隱含屬性self一個全新的實(shí)例.上面的兩個等式也可以寫成

//? ? ? ? ? ? self = Point2(x: x + deltaX, y: y + deltaY)

}

}


//MARK: -- 枚舉的變異方法可以吧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

}

}

}


//MARK: -- 定義類

class Counter {

var count = 0

func increment() {

count += 1 // 類型的每一個實(shí)例都有一個隱含屬性self,self完全等同于該實(shí)例本身,也可以寫成 self.count += 1 一般不寫self,

}

func incrementBy(amount: Int) {

count += amount

} ?func reset() {

?count = 0

}

}


? ?類方法

/*類方法

1. 聲明類的類方法,在方法的func關(guān)鍵字之前加上關(guān)鍵字class;

2. 聲明結(jié)構(gòu)體和枚舉的類方法,在方法的func關(guān)鍵字之前加上關(guān)鍵字static

注意: 在OC中,只能為OC的類定義類方法,在Swift中,可以為類,結(jié)構(gòu)體,枚舉定義類方法,每個類方法都被它所支持的類型顯式的包含

*/

class SomeClass{

class? func someTypeMethod(){

print("調(diào)用了類方法")

}

func someInstanceMethods(){

print("調(diào)用了實(shí)例方法")

}

}

//結(jié)構(gòu)體的類方法

struct LevelTracker {

static var highestUnlockedLevel = 1//靜態(tài)屬性

//定義結(jié)構(gòu)體的類方法 static

static func unlockLevel(level: Int) {

if level > highestUnlockedLevel { highestUnlockedLevel = level }

}

static func levelIsUnlocked(level: Int) -> Bool {

return level <= highestUnlockedLevel

}

var currentLevel = 1//實(shí)例屬性

//實(shí)例方法

mutating func advanceToLevel(level: Int) -> Bool {

if ? LevelTracker.levelIsUnlocked(level: level) {

currentLevel = level

return true

} else {

return false

}

}

}

class Player {

var tracker = LevelTracker()

let playerName: String

func completedLevel(level: Int) {

LevelTracker.unlockLevel(level: level + 1)

let advance =? tracker.advanceToLevel(level: level + 1)

print("\(advance)")

}

init(name: String) {

playerName = name

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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