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”
我确实需要关联的类型为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编译器上测试了它。很顺利,谢谢你,马特。我将把你的问题标记为解决方案,因为你已经证明这是不可能的。谢谢你,马特。我将把你的问题标记为解决方案,因为你已经证明这是不可能的。