类型不符合协议 - 类型别名到另一个协议
Type does not conform to protocol - typealias to another protocol
我遇到了一个烦人的问题,我希望你们能帮我解决这个问题。
我有两个协议和一个 class:
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 即可,或者删除 Anyobject。 Anyobject 是 class 类型。Type Casting for Any and 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 是 AnyObject 的采用者类型。
但是这(你想做的)不合法:
protocol Prot {
associatedtype T: AnyObject
}
protocol SecondProt : AnyObject {
}
class TheClass: Prot {
typealias T = SecondProt // error
}
原因是SecondProt是另一个采用AnyObject的协议。那不是可以放在 typealias T
插槽中的东西。
这与AnyObject的特殊性无关。我们可以在任何地方不提及 AnyObject 得到同样的错误:
protocol P {}
protocol Prot {
associatedtype T: P
}
protocol SecondProt : P {
}
class TheClass: Prot {
typealias T = SecondProt // error
}
同样,如果我们提供采用 P 的 type,我们没问题:
protocol P {}
protocol Prot {
associatedtype T: P
}
struct S : P {
}
class TheClass: Prot {
typealias T = S // fine
}
我遇到了一个烦人的问题,我希望你们能帮我解决这个问题。
我有两个协议和一个 class:
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 即可,或者删除 Anyobject。 Anyobject 是 class 类型。Type Casting for Any and 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 是 AnyObject 的采用者类型。
但是这(你想做的)不合法:
protocol Prot {
associatedtype T: AnyObject
}
protocol SecondProt : AnyObject {
}
class TheClass: Prot {
typealias T = SecondProt // error
}
原因是SecondProt是另一个采用AnyObject的协议。那不是可以放在 typealias T
插槽中的东西。
这与AnyObject的特殊性无关。我们可以在任何地方不提及 AnyObject 得到同样的错误:
protocol P {}
protocol Prot {
associatedtype T: P
}
protocol SecondProt : P {
}
class TheClass: Prot {
typealias T = SecondProt // error
}
同样,如果我们提供采用 P 的 type,我们没问题:
protocol P {}
protocol Prot {
associatedtype T: P
}
struct S : P {
}
class TheClass: Prot {
typealias T = S // fine
}