问题
I have a protocol that I've created (in Swift 4.2), and one of its requirements is a property that is of the same type as the protocol itself.
As an example, I have a protocol defined like so:
protocol A {
var a: A? { get set }
}
I have several Models that conform to this protocol:
class Model1: A {
var a: A?
}
class Model2: A {
var a: A?
}
For one of my models, I need to satisfy the protocol requirement by being more specific for the property defined by variable a
(i.e. the variable with the protocol type). So for example I may want to implement Model2
as:
class Model2: A {
var a: Model1?
}
In this case since Model1
conforms to the protocol A
you would expect this to be able to satisfy the protocol requirement, however I get an error instead:
Type 'Model2' does not conform to protocol 'A'
Why is this happening, and what can I do to make it work as described above?
Appendix
I've modelled the above scenario in an Xcode Playground and here is a screenshot of the error I'm seeing.
回答1:
To conform to protocol A, Model2
would need a member var a
that allows storing a reference to anything conforming to protocol A, not just a reference to a Model1
. So you can't do this.
回答2:
You could do this with associated types:
protocol A {
associatedtype B: A
var a: B? { get }
}
This would let you declare Model2 with the specificity you wish:
class Model2: A {
var a: Model1?
}
But unfortunately, that would mean you could no longer declare variables of type A
. To fix that, you could use generic models:
class Model1<T: A>: A {
var a: T?
}
来源:https://stackoverflow.com/questions/55231410/need-to-satisfy-swift-protocol-requirement-by-using-a-specific-subclass-of-the-r