泛型

1.泛型函数使用了占位类型名T(可以自定义)。来代替实际类型,只有在函数调用时,由传入的实际类型来决定T是什么类型

// 泛型栈
struct Stack {
    var dataList = [Element]()
    mutating func push(_ item: Element) -> Void {
        self.dataList.append(item)
    }
    mutating func pop() -> Element {
        return self.dataList.removeLast()
    }
}

2.扩展一个泛型类型,是可以引用原始定义的类型参数(T)的。

3.类型约束就是类型参数加冒号,跟约束的协议,表示类型需要遵循的协议

4.关联类型,是用在协议里的,用associatedtype指定关联类型itemType,关联类型是占位类型名。然后定义的属性和方法就可以使用关联类型。而对于遵循协议的类型就要用关键字typealias itemType = Int . (Int 为类型使用时的实际类型,比如这里是Int类型)

5.泛型where语句可以指定关联类型的遵循的协议,也可以指定类型参数和关联类型必须类型相同,是放在函数或者类型的大括号之前的,比如

func allItemsMatch(_ someContainer: C1, _ anotherContainer: C2) ->Bool where C1.itemType == C2.itemType, C1.itemType: Equatable {   }// 只有遵循了Equatable协议的类型才能使用相等或者不等于符号。

你可能感兴趣的:(泛型)