Ios 类型不符合协议-typealias不符合其他协议
我正面临一个催眠问题,我希望你们能帮我解决这个问题 我有两个协议和一个类:Ios 类型不符合协议-typealias不符合其他协议,ios,swift2,protocols,Ios,Swift2,Protocols,我正面临一个催眠问题,我希望你们能帮我解决这个问题 我有两个协议和一个类: protocol Prot1: AnyObject { } protocol Prot2 { associatedtype T: AnyObject } class TheClass: Prot2 { typealias T = Prot1 } 这会导致编译器说: 类型“TheClass”不符合协议“Prot2” 在导航中,它显示了更多详细信息: 协议需要嵌套类型“T” 可能预期的匹配“T”
protocol Prot1: AnyObject {
}
protocol Prot2 {
associatedtype T: AnyObject
}
class TheClass: Prot2 {
typealias T = Prot1
}
这会导致编译器说:
- 类型“TheClass”不符合协议“Prot2”
- 协议需要嵌套类型“T”
- 可能预期的匹配“T”(又名“Prot1”)不符合“AnyObject”
OBS:我正在使用swift 2.3将Anyobject更改为Any is ok,或删除Anyobject。Anyobject是类类型。将Anyobject更改为Any is ok,或删除Anyobject。Anyobject是类类型。此代码段编译。但我不确定这是否是你想要的
protocol Prot1: AnyObject
{
}
protocol Prot2
{
associatedtype T: AnyObject
}
class TheClass: Prot2
{
typealias U = Prot1
typealias T = AnyObject
}
这段代码可以编译。但我不确定这是否是你想要的
protocol Prot1: AnyObject
{
}
protocol Prot2
{
associatedtype T: AnyObject
}
class TheClass: Prot2
{
typealias U = Prot1
typealias T = AnyObject
}
为了说明您在这里可以做什么,我将稍微简化这个示例。这是合法的:
protocol Prot {
associatedtype T: AnyObject
}
class TheClass: Prot {
typealias T = AnyObject // fine
}
这也是合法的:
protocol Prot {
associatedtype T: AnyObject
}
class TheClass: Prot {
typealias T = NSObject // fine
}
这是因为NSObject是一种类型,它采用了任何对象
但这(你试图做的)是不合法的:
原因是SecondProt是另一个采用AnyObject的协议。这不是可以放在typealias T
槽中的东西
这与任何对象的特殊性质无关。我们可以在不提及任何对象的情况下得到相同的错误:
protocol P {}
protocol Prot {
associatedtype T: P
}
protocol SecondProt : P {
}
class TheClass: Prot {
typealias T = SecondProt // error
}
同样,如果我们提供采用p的类型,我们可以:
protocol P {}
protocol Prot {
associatedtype T: P
}
struct S : P {
}
class TheClass: Prot {
typealias T = S // fine
}
为了说明您在这里可以做什么,我将稍微简化这个示例。这是合法的:
protocol Prot {
associatedtype T: AnyObject
}
class TheClass: Prot {
typealias T = AnyObject // fine
}
这也是合法的:
protocol Prot {
associatedtype T: AnyObject
}
class TheClass: Prot {
typealias T = NSObject // fine
}
这是因为NSObject是一种类型,它采用了任何对象
但这(你试图做的)是不合法的:
原因是SecondProt是另一个采用AnyObject的协议。这不是可以放在typealias T
槽中的东西
这与任何对象的特殊性质无关。我们可以在不提及任何对象的情况下得到相同的错误:
protocol P {}
protocol Prot {
associatedtype T: P
}
protocol SecondProt : P {
}
class TheClass: Prot {
typealias T = SecondProt // error
}
同样,如果我们提供采用p的类型,我们可以:
protocol P {}
protocol Prot {
associatedtype T: P
}
struct S : P {
}
class TheClass: Prot {
typealias T = S // fine
}
协议不符合自身。类中解析
类型别名T
的方法是使用采用Prot1的类型,而不是Prot1本身。在示例中,协议不符合自身。我有一个协议引用了另一个协议。问题是我需要关联的类型是一个对象,这样我就可以在objc集合中使用真实的对象。你得到解决方案了吗@阿韦诺普。我没有,你需要多想想我说的话。倒数第二行需要指定对象类型,而不是协议名称。协议不符合自身。类中解析类型别名T
的方法是使用采用Prot1的类型,而不是Prot1本身。在示例中,协议不符合自身。我有一个协议引用了另一个协议。问题是我需要关联的类型是一个对象,这样我就可以在objc集合中使用真实的对象。你得到解决方案了吗@阿韦诺普。我没有,你需要多想想我说的话。倒数第二行需要指定对象类型,而不是协议名称。我不能使用“Any”,因为我使用的是只接受AnyObjects的Objc集合。如果删除Prot2中的“Anyobject”,Objc集合可以接受吗?不,不能。显示此错误消息:“无法将“Self.T”类型的值转换为预期的参数类型“AnyObject?”“我不能使用“Any”,因为我使用的是只接受AnyObjects的Objc集合。如果在Prot2中删除“AnyObject”,Objc集合可以接受吗?不,不能。显示此错误消息:“无法将类型为“Self.T”的值转换为预期的参数类型“AnyObject?”“此处无法转换。”。它说“类型‘TheClass’不符合协议‘Prot2’。”。也许是因为我使用了swift 2.3?嘿@Adolfo。你能用swift 3编译这个吗?嗨@Awe我在IBM bluemix swift编译器上测试了它。在这里进展顺利,但事实并非如此。它说“类型‘TheClass’不符合协议‘Prot2’。”。也许是因为我使用了swift 2.3?嘿@Adolfo。你能用swift 3编译这个吗?嗨@Awe我在IBM bluemix swift编译器上测试了它。很顺利,谢谢你,马特。我将把你的问题标记为解决方案,因为你已经证明这是不可能的。谢谢你,马特。我将把你的问题标记为解决方案,因为你已经证明这是不可能的。