1. 泛型函數(shù)
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
let t = a
a = b
b = t
}
var someInt = 3
var anotherInt = 7
swapTwoValues(&someInt, &anotherInt)
print("\(someInt), \(anotherInt)")
// print "7, 3"
var someString = "hello"
var anotherString = "world"
swapTwoValues(&someString, &anotherString)
T
是占位類型名抗蠢,用來代替實(shí)際類型名举哟。
2. 泛型類型
下面的例子定義了一個泛型的棧(stack
)結(jié)構(gòu)體,從而能夠處理任意類型的值迅矛。
struct Stack<Element> {
var items = [Element]()
mutating func push(item: Element) {
items.append(item)
}
mutating func pop() -> Element {
return items.removeLast()
}
}
var stackOfStrings = Stack<String>()
stackOfStrings.push(item: "A")
stackOfStrings.push(item: "B")
stackOfStrings.push(item: "C")
let fromTheTop = stackOfStrings.pop()
3. 擴(kuò)展一個泛型類型
extension Stack {
var topItem: Element? {
return items.isEmpty ? nil : items[items.count - 1]
}
}
stackOfStrings.topItem // "B"
4. 類型約束
func findIndex(ofString valueToFind: String, in array: [String]) -> Int? {
for(index, value) in array.enumerated() {
if value == valueToFind {
return index
}
}
return nil
}
let strings = ["A", "B", "C"]
if let foundIndex = findIndex(ofString: "B", in: strings) {
print("\(foundIndex)")
}
// print "1"
上面的例子展示了在一個字符串?dāng)?shù)組中找到對應(yīng)字符串的索引妨猩,但是并不適用于包含其他類型的元素的數(shù)組。
func findIdex<T: Equatable>(array: [T], _ valueToFind: T) -> Int? {
for (index, value) in array.enumerated() {
if value == valueToFind {
return index
}
}
return nil
}
Equatable
給占位類型 T
添加了類型約束秽褒,意味著上面的函數(shù)只能包含 Equatable
類型的元素壶硅。不是所有的 Swift 類型都可以用 ==
進(jìn)行比較,除非該類型遵循了 Equatable
協(xié)議销斟。
5. 關(guān)聯(lián)類型
關(guān)聯(lián)類型為協(xié)議中的某個類型提供了一個占位名庐椒,其代表的實(shí)際類型在協(xié)議被采納時才會被指定,用關(guān)鍵字 associatedtype
關(guān)鍵字來指定關(guān)聯(lián)類型蚂踊。
protocol Container {
associatedtype ItemType
mutating func append(item: ItemType)
var count: Int { get }
subscript(i: Int) -> ItemType { get }
}
我們還可以通過擴(kuò)展一個存在的類型來指定關(guān)聯(lián)類型约谈,比如:
extension Array: Container {}
6. 泛型Where語句
where
字據(jù)可以給一個關(guān)聯(lián)類型添加類型約束,語法如下:
func genericFunc<S>(p: S) -> returnType where #判斷語句# {
}