Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.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
Ios 泛型对象的受约束扩展与类型不匹配_Ios_Swift_Generics_Protocols_Class Extensions - Fatal编程技术网

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等效,有足够的信息来推断这一点。