Swift函数中的泛型和协议一致性
我刚读过,我想我已经找到了答案:通用协议一致性 他遇到的问题是他有一个协议,Swift函数中的泛型和协议一致性,swift,generics,protocols,Swift,Generics,Protocols,我刚读过,我想我已经找到了答案:通用协议一致性 他遇到的问题是他有一个协议,Value,它符合equalable。他有另一个协议,Smashable,该协议要求通过将其他值混入函数值。他有一个结构,Bar,它实际上符合Smashable和Value 在采用泛型类型T的后续函数中,将返回一个条。Swift类型系统抱怨“Bar”不能转换为“T” 以下是我认为有效的方法: protocol Value: Equatable { } protocol Smashable { func valu
Value
,它符合equalable
。他有另一个协议,Smashable
,该协议要求通过将其他值混入函数值。他有一个结构,Bar
,它实际上符合Smashable
和Value
在采用泛型类型T
的后续函数中,将返回一个条
。Swift类型系统抱怨“Bar”不能转换为“T”
以下是我认为有效的方法:
protocol Value: Equatable { }
protocol Smashable {
func valueBySmashingOtherValue<T: Value, Smashable>(value: T) -> T
}
struct Bar: Smashable, Value {
func valueBySmashingOtherValue<T: Value, Smashable>(value: T) -> T {
return value;
}
}
func ==(lhs: Bar, rhs: Bar) -> Bool {
return false
}
struct Foo {
func valueBySmashingOtherValue<T: Value, Smashable>(value: T) -> T {
return Bar()
}
}
协议值:可等式{}
可破坏协议{
func-valuebymashing其他价值(值:T)->T
}
结构栏:可粉碎,值{
func-valuebymashing其他价值(值:T)->T{
返回值;
}
}
func==(左:条形,右:条形)->Bool{
返回错误
}
结构Foo{
func-valuebymashing其他价值(值:T)->T{
返回条()
}
}
使泛型类型T
符合Value
和Smashable
Bar
实际上符合这些要求,因此您可以返回类型系统
但事实并非如此。为什么?虽然条形图
符合值
和可粉碎
是事实,但它并不是唯一符合这些标准的类型。我可以创建一个新类型(使用最新的Swift语法):
struct NotBar:Smashable,Value{
func-valuebymashing其他价值(值:T)->T{
返回值;
}
}
func==(左:NotBar,右:NotBar)->Bool{
返回真值
}
如果我通过mashing将NotBar
的一个实例传递到Foo.valueBySmashingOtherValue
,则我希望得到一个NotBar
。编译器知道这一点,因此它不允许您返回条
,而条
符合值
和可粉碎
这并不是满足这些条件的唯一类型。我可以创建一个新类型(使用最新的Swift语法):
struct NotBar:Smashable,Value{
func-valuebymashing其他价值(值:T)->T{
返回值;
}
}
func==(左:NotBar,右:NotBar)->Bool{
返回真值
}
如果我通过mashing将NotBar
的一个实例传递到Foo.valueBySmashingOtherValue
,则我希望得到一个NotBar
。编译器知道这一点,因此它不允许您返回Bar
,因为returnT
也受输入参数类型的约束,这可能与Bar
不兼容。因为returnT
也受输入参数类型的约束,这可能与Bar
不兼容。
struct NotBar: Smashable, Value {
func valueBySmashingOtherValue<T:Value where T:Smashable>(value: T) -> T {
return value;
}
}
func ==(lhs: NotBar, rhs: NotBar) -> Bool {
return true
}