【发布时间】:2017-04-25 14:00:43
【问题描述】:
假设我有一个名为 Car 的通用类绑定协议,它有一个从 AnyObject 继承的关联类型。该协议定义了一个变量和一个 addPassenger() 函数,并为其提供了默认实现。
我需要关联类型从 AnyObject 继承,因为我希望能够使用 === 过滤掉调用 addPassenger() 时我已经知道的实例。
protocol Car: class {
associatedtype T: AnyObject
var passengers: [T] { get set }
func addPassenger(_ passenger: T)
}
extension Car {
func addPassenger(_ passenger: T) {
guard passengers.index(where: { $0 === passenger }) == nil else {
return
}
passengers.append(passenger)
}
}
然后我有另一个协议,称为乘客,它必须与 Car 一起使用:
protocol Passenger: AnyObject {}
最后,假设我有一个名为 SomeClass 的类的实例,它符合 Car 协议并定义了一个乘客数组:
class SomeClass: Car {
internal var passengers: [Passenger] = []
}
但是,这是不可能的,因为很明显,Passenger 不符合 AnyObject:
error: type 'SomeClass' does not conform to protocol 'Car'
note: unable to infer associated type 'T' for protocol 'Car'
note: inferred type 'Passenger' (by matching requirement 'passengers') is invalid: does not conform to 'AnyObject'
知道我错过了什么吗?
【问题讨论】:
-
我正在处理类似的问题并问了这个问题:stackoverflow.com/questions/36867827/…。我认为目前关联的类型必须是具体类型,而不是继承自基本协议要求的协议
-
比较Unable to use protocol as associatedtype in another protocol in Swift & Protocol doesn't conform to itself?——
Passenger确实不是符合AnyObject的类型。
标签: swift