每天學一點Swift----物件導向上(八)

weixin_33978044發表於2017-05-30

十.方法(續)

11.值型別可變的方法:預設情況下,結構體和列舉的例項方法不能改變該例項的儲存屬性。如果像讓值型別的例項方法改變該例項的儲存屬性,程式需要用mutating將方法宣告為可變方法。

12.可變方法甚至可以在方法體內對隱式的self重新賦值,這會使得新賦值的例項將在方法結束後替換原有的例項。

13.舉個栗子:

struct test

{

var x : Int

var y : Int

mutating func kebian(x : Int, y : Int)

{

self.x += x

self.y += y

}

}

14.注意:常量型別的結構體、列舉是不可變的,因此不要對常量型別的結構體、列舉呼叫可變方法,否則將會導致編譯錯誤。也不要在可變方法內改變結構體的常量屬性。

15.可變方法改變self的栗子:

enum Planet : Int

{

case Mercury = 0, Venus, Earth, Mars, Jupiter, saturn, Uranus, Nepturn

mutating func next()

{

if self.rawValue < 8 && self.rawValue > -1

{

self = Planet(rawValue : self.rawValue + 1)!

}

}

mutating func prev()

{

if self.rawValue < 8 && self.rawValue > -1

{

self = Planet(rawValue: self.rawValue - 1)!

}

}

}

var pt = Planet.Venus

pt.next()//pt變成.Earth

pt.next()//pt變成.Mars

pt.prev()//pt變成.Earth

16.如果程式使用函式型別定義儲存型別,並將函式或閉包作為該屬性的初始值,那麼這個屬性就成了方法

17.換個角度來看,方法相當於一種一let宣告的、型別為函式型別的儲存屬性。如果程式使用var宣告儲存屬性,並將函式或閉包作為該屬性的初始值,這樣也可以定義方法,而且這樣定義的方法比原來型別中的方法更加靈活:因為該方法的本質是var宣告的變數儲存屬性,因此程式可以隨時改變方法的實現體。

18.下面程式示範了以儲存屬性的方式來定義函式

//定義一個計算階乘的全域性函式

func factorial(n : Int) -> Int

{

var result = 1

for index 1...n

{

result *= index

}

}

struct SomeStruct

{

//將一個閉包作為info儲存屬性的初始值

var info: () -> void = {

print("info method...")

}

//將factorial全域性函式作為fact儲存屬性的初始值

static var fact: (Int) -> Int = factorial

}

var sc = SomeStruct()

//呼叫info方法

sc.info()

//使用閉包對sc物件的info賦值,相當於重新定義sc的info方法

sc.info = {

print("reset info")

print("another method")

}

//再次呼叫info方法

sc.info()

var n = 6;

//呼叫fact方法,執行的是階乘

SomeStruct.fact(6)

//使用閉包對SomeStruct的fact賦值,將階乘重新定義為累加

SomeStruct.fact = {

var result = 1;

for index 1...$0{

result += index

}

return result

}

相關文章