类型约束

92 阅读1分钟
protocol Runnable {}
class Person {}
// T: Person & Runnable 因为T是泛型,所以这代表泛型约束,此处作用是:要求类型T必须要是Person类型,而且要遵循Runnable协议
func swapValues<T: Person & Runnable>(_ a: inout T, _ b: inout T) {
	(a, b) = (b, a)
}
protocol Stackable {
	associatedtype Element: Equatable
}

// 关联类型约束
class Stack<E: Equatable>: Stackable{
	typealias Element = E
}
 
func equal<S1: Stackable, S2: Stackable>(_ s1: S1, _ s2: S2) -> Bool where S1.Element == S2.Element, S1.Element: Hashable
{
	return false
}
var s1 = Stack<Int>()
var s2 = Stack<Int>()
var s3 = Stack<String>()

equal(s1, s2)
equal(s1, s3) // Int与String不相同此时会报错