iOS學習筆記43 Swift 三 類

2021-07-11 10:19:36 字數 4879 閱讀 1856

作為一門物件導向語言,類也是swift的非常重要的型別,我們先來看下乙個簡單的類

//swift中乙個類可以不繼承於任何其他基類,那麼此類本身就是乙個基類

class person

//析構器方法,在物件被釋放時呼叫,類似於objc的dealloc,注意這裡沒有括號和引數,無法直接呼叫

deinit

//定義物件方法

func showmessage()

}//建立類的物件

var p = person(name: "liuting")

p.height =170.0

p.showmessage() //結果:name=liuting,height=170.0

//類是引用型別

var p2 = p

p2.name = "xiaoming"

println(p.name) //結果:xiaoming

//「===」表示等價於,這裡不能使用等於「==」,等於用於比較值相等,p和p2是不同的值,但是指向的物件相同

if p === p2

swift中淡化了成員屬性的概念,把屬性分為兩種:

1.儲存屬性

無論從概念上還是定義方式上來看,儲存屬性更像其他語言中的成員變數,但是不同的是:

* 可以控制讀寫操作(var表示可讀可寫,let表示唯讀)

* 通過屬性監視器來屬性的變化(willsetdidset

* 快速實現懶載入功能(lazy修飾)

2.計算屬性

計算屬性並不直接儲存乙個值,而是提供getter來獲取乙個值,或者利用setter來間接設定其他屬性。

下面是物件屬性使用例項:

class

account

//賦值完成後呼叫

didset

}}class

person

//設定該計算屬性時呼叫

set)

ifarray.count == 2 }}

//構造器方法,注意如果不編寫構造方法缺省會自動建立乙個無參構造方法

init(firstname:string, lastname:string, age:int)

//定義方法

func showmessage()

}//建立物件

var p = person(firstname: "liu", lastname: "ting", age:22)

p.showmessage() //結果:name=liu.ting,age=22

p.fullname = "liu.haha"

//設定計算屬性

p.showmessage() //結果:name=liu.haha,age=22

p.account.balance = 10

/* 下面是儲存屬性***方法列印:

account.balance willset,newvalue=10,value=0.0

account.balance didset,oldvalue=10,value=3.0

*/println("p.account.balance=\(p.account.balance)") //結果:p.account.balance=3.0

計算屬性並不直接儲存乙個值,而是提供getter來獲取乙個值,或者利用setter來間接設定其他屬性;

lazy屬性必須有初始值,必須是變數不能是常量,因為常量在構造完成之前就已經確定了值;

在構造物件方法之前儲存屬性必須有值(可選型別除外),無論是變數屬性還是常量屬性,這個值既可以在屬性建立時指定,也可以在構造方法內指定;

儲存屬性的預設值設定不會引起屬性監視器的呼叫(另外在構造方法中賦值也不會引起屬性監視器呼叫),只有在外部設定儲存屬性才會引起屬性監視器呼叫;

除了上面的物件屬性外,我們還可以定義類的屬性:

class

student

}}//讀取類的屬性

for color in student.skin

swift的類中的方法可分為以下幾個類別:

構造器方法

析構器方法

物件方法

類方法

以下是方法使用例項:

class person 

便利構造方法,通過呼叫指定構造方法、提供預設值來簡化構造方法實現

convenience init(name:string)

//2.析構方法,在物件被釋放時呼叫,注意此方法沒有括號,沒有引數,無法直接呼叫

deinit

//3.物件方法

func modifyinfowithage(age:int, height:double)

//4.類方法,使用class修飾的方法即是類方法

class func showclassname()

}//通過便利構造方法建立物件

var p = person(name: "liuting")

//呼叫物件方法

p.modifyinfowithage(22,height: 170)

//呼叫類方法

person.showclassname()

除構造方法、析構方法外,其他方法的引數預設除了第乙個引數是區域性引數,從第二個引數開始既是區域性引數又是外部引數。但是,對於函式,預設情況下只有預設引數既是區域性引數又是外部引數,其他引數都是區域性引數。

構造方法的所有引數預設情況下既是外部引數又是區域性引數

只有便利構造器方法才能呼叫當前類的指定構造方法

有引數的指定構造器方法會覆蓋呼叫預設的無參構造器方法

乙個物件被釋放前,先自動呼叫自己的析構方法,然後一層一層往上呼叫父類的析構方法

下標指令碼是一種訪問集合的快捷方式,如果我們自定義的類具有集合型別的功能,我們可以定義下標指令碼來快捷訪問該類屬性,定義下標指令碼是通過關鍵字subscript進行的。

class record 

//下標指令碼,下標索引為整形(注意也可以實現只有getter的唯讀下標指令碼)

subscript(index:int) -> string

set}

//下標指令碼,下標索引為字串

subscript(key:string) -> string

set}

}//建立物件

var record = record(data:["name":"liuting","***":"male"])

println("r[0]=\(record[0])") //結果:r[0]=liuting

record["***"] = "female"

println(record["***"]) //結果:female

和objc一樣,swift也是單繼承的(可以實現多個協議,此時協議放在後面),子類可以呼叫父類的屬性、方法,重寫父類的方法,新增屬性監視器,甚至可以將唯讀屬性重寫成讀寫屬性。

//定義乙個父類

class

person

}//指定構造方法

init(firstname:string,lastname:string)

//物件方法

func showmessage()

//通過final宣告,子類無法重寫

final func sayhello()

}//定義子類

class

student: person

didset

}//新增子類屬性

var score:double

//子類指定構造方法一定要呼叫父類構造方法

//並且必須在子類儲存屬性初始化之後呼叫父類構造方法

init(firstname:string, lastname:string, score:double)

//便利構造方法

convenience init()

//將唯讀屬性重寫成了可寫屬性

override

var fullname:string

set)

if array.count == 2 }}

//重寫物件方法

override func showmessage()

}//建立子類物件

var p = student()

p.firstname = "liu"

p.showmessage() //結果:name=liu,age=0,score=0

p.fullname = "liu.ting"

p.showmessage() //結果:name=liu.ting,age=0,score=0

p.sayhello()

只有指定構造方法才能呼叫父類的構造方法。

如果父類中存在有引數的指定構造方法,子類的指定構造方法不會自動呼叫父類無參的指定構造方法。

如果父類僅有乙個無參構造方法(不管是否包含便利構造方法),子類的構造方法預設就會自動呼叫父類的無參構造方法(這種情況下可以不用手動呼叫)。

常量屬性只能在定義它的類的構造方法中初始化,不能在子類中初始化

乙個物件被釋放前,先自動呼叫自己的析構方法,然後一層一層往上呼叫父類的析構方法。

便利構造方法必須呼叫同乙個類中的其他指定構造方法(可以是指定構造方法或者便利構造方法),不能直接呼叫父類構造方法。

學習Swift筆記 (三)

字元和字串 字串常量可以包括下面這些特殊字元 空字元 0,反斜槓 製表符 t,換行符 n,回車符 r,雙引號 和單引號 單位元組unicode字元,xnn,其中nn是兩個十六進製制數 雙位元組unicode字元,unnnn,其中nnnn是四個十六進製制數 四位元組unicode字元,unnnnnnn...

swift 學習筆記三

這一章主要學習swift的陣列與字典 1 陣列的概念和定義 var array 2,3,4,5 寫法1 print array var array2 array a b c 寫法2 print array2 array2 var array3 array 4,5,6 寫法3 print array3...

iOS 學習筆記, Swift名字空間

在swift中,名字空間是用class extension 巢狀來實現的,以下用乙個簡單樣例來進行展示 main.swift swiftnamespace created by yao yu on 14 8 1.swift名字空間使用例項 import foundation 定義頂層名字空間 cla...