Awe*_*Awe 0 protocols ios swift2
我正面临一个恼人的问题,我希望你们能帮我解决这个问题。
我有两个协议和一个类:
protocol Prot1: AnyObject {
}
protocol Prot2 {
associatedtype T: AnyObject
}
class TheClass: Prot2 {
typealias T = Prot1
}
Run Code Online (Sandbox Code Playgroud)
这导致编译器说:
在导航中,它显示了更多详细信息:
我真的需要关联类型是AnyObject类型。这就是我需要帮助的原因。
有谁知道如何解决这个问题?
非常感谢。
OBS:我使用的是 swift 2.3
为了展示您可以在此处执行的操作的性质,我将稍微简化示例。这是合法的:
protocol Prot {
associatedtype T: AnyObject
}
class TheClass: Prot {
typealias T = AnyObject // fine
}
Run Code Online (Sandbox Code Playgroud)
这也是合法的:
protocol Prot {
associatedtype T: AnyObject
}
class TheClass: Prot {
typealias T = NSObject // fine
}
Run Code Online (Sandbox Code Playgroud)
那是因为 NSObject 是一个类型,它是AnyObject的采用者。
但这(你试图做的)是不合法的:
protocol Prot {
associatedtype T: AnyObject
}
protocol SecondProt : AnyObject {
}
class TheClass: Prot {
typealias T = SecondProt // error
}
Run Code Online (Sandbox Code Playgroud)
原因是 SecondProt 是另一个采用 AnyObject 的协议。那不是可以进入typealias T
插槽的东西。
这与 AnyObject 的特殊性质无关。我们可以在任何地方不提及 AnyObject 的情况下得到相同的错误:
protocol P {}
protocol Prot {
associatedtype T: P
}
protocol SecondProt : P {
}
class TheClass: Prot {
typealias T = SecondProt // error
}
Run Code Online (Sandbox Code Playgroud)
同样,如果我们提供一个采用 P的类型,我们就可以了:
protocol P {}
protocol Prot {
associatedtype T: P
}
struct S : P {
}
class TheClass: Prot {
typealias T = S // fine
}
Run Code Online (Sandbox Code Playgroud)