在擴充套件裡新增協議遵循
你可以擴充套件乙個已經穿在的型別來採納和遵循乙個新的協議,舊算時你無法訪問現有的型別的源**也行,擴充套件可以新增新的屬性、方法、和下標到已經存在的型別。並且因此允許你新增協議需要的任何結果
//: from
import uikit
protocol textrepresentable
}extension dice:textrepresentable
}
有條件地遵循協議,泛型型別可能只在某些情況下滿足乙個協議的要求,比如當型別的泛型形式引數遵循對應協議時。你可以通過在擴充套件型別時列出限制讓泛型有條件地遵循某協議,在你採納協議的名字後面寫泛型where語句。
//: from
import uikit
protocol textrepresentable
}extension array:textrepresentable where element:textrepresentable
return "["+itemastext.joined(separator: ",")+"]"
}}//d6 d12 是骰子元素 暫時還未建立
let mydice = [d6,d12]
print(mydice.textualdescition)
使用擴充套件宣告採納協議
如果乙個型別已經遵循了協議的所有需求,但是還沒有宣告它採納了這個協議,你可以讓通過乙個空的擴充套件來讓他採納這個協議
//: from
import uikit
struct hamster
}extension hasmster:textrepresentable{}
協議擴充套件
協議可以通過擴充套件來提供方法和屬性的實現以遵循型別,這就允許你在協議自身定義行為,而不是在每乙個遵循或者在全域性函式裡定義
//: from
import uikit
extension randomnumbergenerator
}let generator = linearcongruenruentialgenerator()
print(generator.random())
print(generator.randombool())
提供預設實現
你可以使用協議擴充套件來給協議的任意方法或者計算屬性,要求提供預設實現。如果遵循型別給這個協議的要去提供了它的實現,那麼它就會代替擴充套件中提供的預設實現。
//: from
import uikit
protocol textrepresentable
}protocol named
}protocol aged
}struct person:named,aged
let p = person(name: "zhangsan ", age: 32)
extension person:textrepresentable
}print(p.desc)
name is zhangsan ,age 32
//: from
import uikit
protocol textrepresentable
}protocol named
}protocol aged
}struct person:named,aged
let p = person(name: "zhangsan ", age: 32)
extension person:textrepresentable
}extension array:textrepresentable where element:textrepresentable
return itemdesc.joined(separator: ",")
}}let array = [person(name: "zhangsan",age: 2),person(name: "zhangsan2",age: 32)]
print(array.desc)
name is zhangsan ,age 2,name is zhangsan2 ,age 32
可以直接修改協議本身
//: from
import uikit
protocol textrepresentable
}protocol named
}protocol aged
}struct person:named,aged
let p = person(name: "zhangsan ", age: 32)
extension person:textrepresentable
}extension collection where iterator.element:textrepresentable
return itemdesc.joined(separator: ",")
}}let array = [person(name: "zhangsan",age: 2),person(name: "zhangsan2",age: 32)]
print(array.desc)
Swift2學習 Swift概覽6 協議和擴充套件
協議和擴充套件 用protocol宣告乙個協議。protocol exampleprotocol mutating func adjust 類,列舉和結構體都可以接受協議。class class exampleprotocol var a class a.adjust let adescriptio...
swift繼承 多型 擴充套件 協議
swift的繼承是單一繼承。class classname superclass 方法多型 class baseclass class superclass 屬性多型 通過繼承屬性 你可以改變 get和set class baseclass class superclass 禁止多型 將整個類標識為...
Swift 優雅的協議擴充套件
先看呼叫效果 123456 yy str.md5forlower32bate 123456 yy str.md5forlower32bate 類似 view.snp.為什麼要這麼做呢?好處在哪呢?降低耦合度 傳統的寫法,直接在類別中新增乙個方法或屬性例如 extension string d d x...