类型不符合协议 - 另一个协议的类型别名

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)

这导致编译器说:

  • 类型“TheClass”不符合协议“Prot2”。

在导航中,它显示了更多详细信息:

  • 协议需要嵌套类型“T”
  • 可能预期的匹配“T”(又名“Prot1”)不符合“AnyObject”

我真的需要关联类型是AnyObject类型。这就是我需要帮助的原因。

有谁知道如何解决这个问题?

非常感谢。

OBS:我使用的是 swift 2.3

mat*_*att 6

为了展示您可以在此处执行的操作的性质,我将稍微简化示例。这是合法的:

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)