Swift 约束泛型占位符类型

示例

例如,可以强制泛型类的类型参数来实现协议, Equatable

class MyGenericClass<Type: Equatable>{
    
    var value: Type
    init(value: Type){
       self.value= value
    }
    
    func getValue() -> Type{
        return self.value
    }

    func valueEquals(anotherValue: Type) -> Bool{
        returnself.value== anotherValue
    }
}

每当我们创建一个new时MyGenericClass,type参数都必须实现Equatable协议(确保可以使用将该type参数与相同类型的另一个变量进行比较==)

let myFloatGeneric = MyGenericClass<Double>(value: 2.71828) // “无法将类型为“字符串”的值转换为预期的参数类型为“ Int””“无法将类型为“字符串”的值转换为预期的参数类型为“ Int””“类型[Int]不符合协议'Equatable'”“类型[Int]不符合协议'Equatable'”有效
let myStringGeneric = MyGenericClass<String>(value: "My String") // “无法将类型为“字符串”的值转换为预期的参数类型为“ Int””“无法将类型为“字符串”的值转换为预期的参数类型为“ Int””“类型[Int]不符合协议'Equatable'”“类型[Int]不符合协议'Equatable'”有效

// “无法将类型为“字符串”的值转换为预期的参数类型为“ Int””“无法将类型为“字符串”的值转换为预期的参数类型为“ Int””“类型[Int]不符合协议'Equatable'”"Type [Int] does not conform to protocol 'Equatable'"
let myInvalidGeneric = MyGenericClass<[Int]>(value: [2]) 

let myIntGeneric = MyGenericClass<Int>(value: 72)
print(myIntGeneric.valueEquals(72)) // “无法将类型为“字符串”的值转换为预期的参数类型为“ Int””“无法将类型为“字符串”的值转换为预期的参数类型为“ Int””“类型[Int]不符合协议'Equatable'”true
print(myIntGeneric.valueEquals(-274)) // “无法将类型为“字符串”的值转换为预期的参数类型为“ Int””“无法将类型为“字符串”的值转换为预期的参数类型为“ Int””“类型[Int]不符合协议'Equatable'”false

// “无法将类型为“字符串”的值转换为预期的参数类型为“ Int””“无法将类型为“字符串”的值转换为预期的参数类型为“ Int””“类型[Int]不符合协议'Equatable'”"Cannot convert value of type 'String' to expected argument type 'Int'"
print(myIntGeneric.valueEquals("My String"))