作為一門物件導向語言,類也是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
表示唯讀)
* 通過屬性監視器來屬性的變化(willset
、didset
)
* 快速實現懶載入功能(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...