【iOS】Swift中擴充extension與協議protocol,swiftextension
一起連帶前面幾篇Playground小結代碼都轉到github上了,注釋寫了很多,主要方便自己以後可以翻翻看。Swift文法主要部分差不多就這些了。當然還有泛型、運算子多載、ARC、閉包之類的補充。
一、擴充(extension)
擴充 extension(類似OC中的分類,但Swift中沒有名字),即使在沒有許可權擷取到原始代碼的情況下,為類增加新功能.
注意: 只要定義了擴充, 那麼該擴充對該類的執行個體都是可用的.
extension SomeType{ //添加到SomeType的新功能寫在這裡}
1.1擴充屬性(只能是計算屬性)
//擴充可以添加新計算屬性, 但是不能添加儲存屬性(也不可以添加屬性觀察).extension Double{ //為API中的已有類型添加執行個體屬性 var km : Double { return self * 1_000.0 } var m : Double { return self } var cm : Double { return self / 100.0 }}let jjLength = 1.m // 1與m進行點運算, 表示1的Double值let jjLength_km = 1.kmprintln(10.km + 1.m)
1.2擴充構造器
//可以定製自己的構造器class MyClass{ var a : Int init(){ a = 10 }}extension MyClass{ convenience init(var parm:Int){ //擴充構造器 self.init() println("擴充構造器--->遍曆構造器, \(parm)") }}var myClass = MyClass(parm: 9)
1.3擴充方法
下面是像Int中擴充myIntFunc方法
extension Int{ func myIntFunc(){ println("值為\(self) , 哈哈哈哈!") }}1.myIntFunc()
1.3.1 修改執行個體方法
通過擴充方法, 可以修改該執行個體self本身.但是方法前要加 mutating
extension Double{ mutating func myMoidfySelfValue{ self = self * self //修改self執行個體的值 }}var d = 2.0d.myMoidfySelfValue()
1.4 擴充巢狀型別
即向已有的巢狀型別中添加新的巢狀型別. 還可以擴充下標(附屬指令碼)等.
extension Character { enum Kind{ //嵌套了一個枚舉類型 case Big case Small } var k : Kind{ if(String(self).lowercaseString == "a"){ return Kind.Big }else{ return Kind.Small } }}var ch : Character = "a"ch.k //返回一個枚舉值Kind.Big
二、協議(protocol)
可定義方法與屬性, 由具體的類去實現. 越來越像Java
Swift中的協議能被類, 枚舉,結構體實現.
protocol SomeProtocol{ //協議內容}class SomeClass : SomeProtocol{ //實現協議, 可實現多個協議 }
2.1 協議中屬性/方法/突變方法的要求
2.1.1 屬性的要求
protocol AnotherProtocol1{ //class表示類成員(結構體/枚舉中用static) class var property : Int { get set} //get, set 表示可讀可寫}class AnotherClass1 : AnotherProtocol1{ class var property : Int { //實現協議中的屬性 get{ return 10 } set{ } }}
2.1.2 方法要求
//不支援預設參數. 寫法上只是沒有方法的實現.protocol AnotherProtocol2{ func myFunc() -> Int //只聲明不實現}class AnotherClass2 : AnotherProtocol2{ func myFunc() -> Int { //實現方法 return 10 }}
2.1.3 突變方法要求
能在方法或函數內部改變執行個體類型的方法稱為突變方法. (mutating關鍵字)
在類中,可以不寫mutating, 但在結構體與枚舉中國必須寫
protocol Togg{ mutating func togg()}enum OnOffSwitch : Togg{ case Off , On mutating func togg() { //改變執行個體的值 switch self{ case .Off: self = On case .On: self = Off } }}var lightSwitch = OnOffSwitch.OfflightSwitch.togg() //值變為On
2.2 協議類型.
協議也可以當做類型來使用. 這點和函數一樣.
1.可作為參數/返回值類型
2.可作為常量/變數/屬性的類型
3.可作為數組/字典和其他元素類型
protocol MyRect{ func myLuckNumber() -> Int}class MyRectImp : MyRect{ func myLuckNumber() -> Int { return 10 }}class Dice { let sides :Int var gener : MyRect //作為類型 init(sides:Int, gener:MyRect){ //作為參數 self.sides = sides self.gener = gener }}var dice = Dice(sides: 6, gener: MyRectImp())dice.gener.myLuckNumber() //返回10
範例程式碼見:http://github.com/xn4545945/SwiftLearning
參考:
The Swift Programming Language
Apple Dev Center
轉載請註明出處:http://blog.csdn.net/xn4545945