每天學一點Swift----物件導向上(八)
十.方法(續)
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
}
相關文章
- JSTL 每天積極向上JS
- javaWeb 每天積極向上JavaWeb
- 尚矽谷_Java零基礎教程(物件導向上)--學習筆記(十一)Java物件筆記
- Java零基礎學習之路(八)Java物件導向Java物件
- Java入門教程八(物件導向)Java物件
- 向上領導,向下賦能
- 每天學點node系列-zlib
- 每天學點node系列-httpHTTP
- 每天學點node系列-stream
- 每天學點SpringCloud(一):使用SpringBoot2.0.3整合SpringCloudGCCloudSpring Boot
- 物件導向:做好自己,開朗穩重,積極向上,凡事為他人考慮物件
- 每天學習一點ES6(二)let 和 const
- PHP 物件導向 (八)類的自動載入PHP物件
- 每天進步一點點 2020/09/24
- 每天讀一點webpack-001Web
- 每天成長一點---WEB前端學習入門筆記Web前端筆記
- python物件導向一Python物件
- Java物件導向(一)Java物件
- python物件導向(一)Python物件
- 學習Rust 物件導向Rust物件
- JS物件導向程式設計(一):物件JS物件程式設計
- C++ 物件導向 一C++物件
- 如何理解物件導向(一)物件
- Lua學習(二)物件導向物件
- 草根學Python(九) 物件導向Python物件
- PHP學習4——物件導向PHP物件
- 每天學一點 Vue3(一) CND方式的安裝以及簡單使用Vue
- 【python 物件導向】 python物件學習筆記《1》Python物件筆記
- 物件導向-物件導向思想物件
- JavaSE —— 第11步 —— 最關鍵的一點(物件導向) 11.1物件導向和麵向過程的區別Java物件
- Java第八課. 物件導向特徵3-多型&抽象類Java物件特徵多型抽象
- Cris 的 Scala 筆記整理(八):物件導向中級-封裝筆記物件封裝
- 每天學點node系列-fs檔案系統
- [每天進步一點點]mysql筆記整理(三):索引MySql筆記索引
- 日常Java練習題(每天進步一點點系列)Java
- 初學Solidity(三):Solidity物件導向Solid物件
- 一個人就需要物件之js中八種建立物件方式物件JS
- python中物件導向有什麼特點Python物件
- 物件導向知識點總結歸納物件