Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift函数中的泛型和协议一致性_Swift_Generics_Protocols - Fatal编程技术网

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 valueBySmashing​OtherValue​<T: Value, Smashable>(value: T) -> T
}

struct Bar: Smashable, Value {
    func valueBySmashing​OtherValue​<T: Value, Smashable>(value: T) -> T {
        return value;
    }
}

func ==(lhs: Bar, rhs: Bar) -> Bool {
    return false
}

struct Foo {
    func valueBySmashing​OtherValue​<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.valueBySmashing​OtherValue
,则我希望得到一个
NotBar
。编译器知道这一点,因此它不允许您返回

,而
符合
可粉碎
这并不是满足这些条件的唯一类型。我可以创建一个新类型(使用最新的Swift语法):

struct NotBar:Smashable,Value{
func-valuebymashing​其他价值​(值:T)->T{
返回值;
}
}
func==(左:NotBar,右:NotBar)->Bool{
返回真值
}

如果我通过mashing将
NotBar
的一个实例传递到
Foo.valueBySmashing​OtherValue
,则我希望得到一个
NotBar
。编译器知道这一点,因此它不允许您返回
Bar

,因为return
T
也受输入参数类型的约束,这可能与
Bar
不兼容。因为return
T
也受输入参数类型的约束,这可能与
Bar
不兼容。
struct NotBar: Smashable, Value {
    func valueBySmashing​OtherValue​<T:Value where T:Smashable>(value: T) -> T {
        return value;
    }
}
func ==(lhs: NotBar, rhs: NotBar) -> Bool {
    return true
}