gpt4 book ai didi

swift - 具有从 AnyObject 继承的关联类型的通用协议(protocol)不会将另一个协议(protocol)视为从 AnyObject 继承

转载 作者:行者123 更新时间:2023-11-28 15:41:35 25 4
gpt4 key购买 nike

假设我有一个名为 Car 的通用类绑定(bind)协议(protocol),它具有一个继承自 AnyObject 的关联类型。该协议(protocol)定义了一个变量和一个 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)
}
}

然后我有另一个名为 Passenger 的协议(protocol),它必须与 Car 一起使用:

protocol Passenger: AnyObject {}

最后,假设我有一个名为 SomeClass 的类的实例,它符合 Car 协议(protocol)并定义了一个 Passenger 数组:

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'

知道我错过了什么吗?

最佳答案

实现协议(protocol)时必须使用具体类型作为associatedType。我认为这与需要在编译时知道用于泛型类型的类型这一事实有关。因此,由于与此相同的原因,您的案例无法编译:

protocol A { }

class B: A { }

func f<T: A>(x: T) { }

// doesn't compile
let x: A = B()
f(x: x)

// compiles
let x = B()
f(x: x)

因为需要在编译时知道泛型类型 T。

在您的情况下,如果您希望 SomeClass 使用符合 Passenger 的不同类型,您可以使用泛型使其工作:

class SomeClass<T: Passenger>: Car {
var passengers: [T] = []
}

或者,您当然可以改用基类

class BasePassenger: AnyObject {}

class SomeClass: Car {
var passengers: [BasePassenger] = []
}

希望对您有所帮助!祝你好运!

关于swift - 具有从 AnyObject 继承的关联类型的通用协议(protocol)不会将另一个协议(protocol)视为从 AnyObject 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43612834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com