假設我有一個名爲Car的通用類綁定協議,它具有從AnyObject繼承的關聯類型。該協議有一個變量和一個addPassenger()函數,併爲其提供了一個默認實現。具有從AnyObject繼承的關聯類型的泛型協議沒有看到從AnyObject繼承的另一個協議
我需要關聯的類型從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)
}
}
然後我有另一個稱爲乘客協議,該協議必須與汽車可用:
protocol Passenger: AnyObject {}
最後,假設我有一個名爲SomeClass的類,它符合汽車協議,並限定一個陣列的一個實例旅客:
class SomeClass: Car {
internal var passengers: [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'
任何想法我錯過了什麼?
我正在處理類似的問題,並提出這個問題:http://stackoverflow.com/questions/36867827/how-to-make-protocol-associated-type-require-protocol-inheritance-and-not-protoc。我認爲當前關聯類型必須是具體類型,而不是從基本協議要求繼承的協議類型。 –
比較[在Swift中無法將協議用作其他協議中的關聯類型](http://stackoverflow.com/q/37360114/2976878)&[協議本身不符合?](http://stackoverflow.com/a/43408193/2976878) - Passenger確實不是符合AnyObject的類型。 – Hamish