Ios 泛型对象的受约束扩展与类型不匹配
我试图对一个泛型类进行扩展,这个泛型类受泛型类型的约束。我认为这是对代码的简化:Ios 泛型对象的受约束扩展与类型不匹配,ios,swift,generics,protocols,class-extensions,Ios,Swift,Generics,Protocols,Class Extensions,我试图对一个泛型类进行扩展,这个泛型类受泛型类型的约束。我认为这是对代码的简化: struct Thing<T> { var value: T } struct ContainsStringThing { var stringThing: Thing<String> } extension Thing where T == String { // <-- Error location f
struct Thing<T> {
var value: T
}
struct ContainsStringThing {
var stringThing: Thing<String>
}
extension Thing where T == String { // <-- Error location
func containedStringThing() -> ContainsStringThing {
return ContainsStringThing(stringThing: value)
}
}
struct东西{
var值:T
}
结构包含字符串{
一件事:一件事
}
扩展项,其中T==String{//ContainsStringThing{
返回ContainsStringThing(stringThing:value)
}
}
但是,我收到以下错误消息:
同一类型要求使泛型参数“T”非泛型
我搜索了一种方法来修复此问题,并找到了一个建议,即使用协议来约束扩展,而不是使用类型:。在这样做之后,我最终得出了以下结论:
protocol StringProtocol { }
struct Thing<T> {
var value: T
}
struct ContainsStringThing {
var stringThing: Thing<StringProtocol>
}
extension Thing where T: StringProtocol {
func containedStringThing() -> ContainsStringThing {
return ContainsStringThing(stringThing: self) // <-- Error location
}
}
protocol-StringProtocol{}
结构物{
var值:T
}
结构包含字符串{
一件事:一件事
}
T:StringProtocol的扩展{
func containedStringThing()->containssStringThing{
returncontainsstringthing(stringThing:self)/作为一种解决方法,您可以使用self的值创建Thing的新实例
extension Thing where T: StringProtocol {
func containedStringThing() -> ContainsStringThing {
return ContainsStringThing(stringThing: Thing<StringProtocol>(value: self.value))
}
}
扩展,其中T:StringProtocol{
func containedStringThing()->containssStringThing{
return包含stringThing(stringThing:Thing(value:self.value))
}
}
在Swift 2.2中,这种扩展约束意味着containedStringThing()函数将可用于值类型符合StringProtocol的对象实例
如果Swift编译器能够将self.value的类型推断为StringProtocol,那就太好了。在这种情况下,您只需编写
包含stringThing(stringThing:self)
而不是
包含stringThing(stringThing:Thing(value:self.value))
。您一定要填写提案。作为一种解决方法,您可以使用self的值创建Thing的新实例
extension Thing where T: StringProtocol {
func containedStringThing() -> ContainsStringThing {
return ContainsStringThing(stringThing: Thing<StringProtocol>(value: self.value))
}
}
扩展,其中T:StringProtocol{
func containedStringThing()->containssStringThing{
return包含stringThing(stringThing:Thing(value:self.value))
}
}
在Swift 2.2中,这种扩展约束意味着containedStringThing()函数将可用于值类型符合StringProtocol的对象实例
如果Swift编译器能够将self.value的类型推断为StringProtocol,那就太好了。在这种情况下,您只需编写
包含stringThing(stringThing:self)
而不是
包含stringThing(stringThing:Thing(value:self.value))
。你绝对应该填写一份建议书。遗憾的是,这对我不起作用。正如我在帖子中所说,这是问题的简化,对象要复杂得多,仅仅传递内部值本身是不够的。遗憾的是,这对我不起作用。正如我在帖子中所说,这是问题的简化,Thing对象要复杂得多,仅传输内部值本身是不够的。第二个代码的问题是T不符合StringProtocol。它不能,因为您没有符合StringProtocol的类型!(协议不是一级类型,不能符合自身。)受约束的扩展应该在内部声明T符合StringProtocol(在本例中)。这意味着您可以将T分配给任何需要符合StringProtocol的类型的对象。根据相同的逻辑,作为Thing的对象的类型也应该等同于Thing,有足够的信息来推断这一点。第二个代码的问题是T不符合StringProtocol。它不能,因为您没有类型符合StringProtocol!(协议不是一级类型,不能符合自身。)受约束扩展应在内部声明T符合StringProtocol(在本例中)。这意味着您可以将T分配给任何需要符合StringProtocol的类型的对象。根据相同的逻辑,作为Thing的对象的类型也应该与Thing等效,有足够的信息来推断这一点。