結(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
}
}