Sprawdziłem wszystkie odpowiedzi na temat tego problemu na stackoverflow, ale nadal nie mogę wymyślić, jak to naprawić. Mój model wygląda takTablica typu protokołu
protocol Commandable: Equatable {
var condition: Condition? {get set}
func execute() -> SKAction
}
i 3 strukturach, które realizują ten protokół
struct MoveCommand: Commandable {
var movingVector: CGVector!
//MARK: - Commandable
var condition: Condition?
func execute() -> SKAction {
...
}
}
extension MoveCommand {
// MARK:- Equatable
static func ==(lhs: MoveCommand, rhs: MoveCommand) -> Bool {
return lhs.movingVector == rhs.movingVector && lhs.condition == rhs.condition
}
}
struct RotateCommand: Commandable {
var side: RotationSide!
// MARK: - Commandable
var condition: Condition?
func execute() -> SKAction {
...
}
}
extension RotateCommand {
// MARK: - Equatable
static func ==(lhs: RotateCommand, rhs: RotateCommand) -> Bool {
return lhs.side == rhs.side && lhs.condition == rhs.condition
}
}
Problemy zaczynają gdy próbuję utworzyć trzecią strukturę, która ma tablicę z [Commandable]:
struct FunctionCommand: Commandable {
var commands = [Commandable]()
Dane wyjściowe kompilatora: Protocol 'Commandable' can only be used as a generic constraint because it has Self or associated type requirements
. Następnie przepisałem swoją strukturę w następujący sposób:
struct FunctionCommand<T : Equatable>: Commandable {
var commands = [T]()
Rozwiązuję ten problem, ale pojawił się nowy problem. Teraz nie mogę tworzyć FunctionCommand
z wystąpień obracać i polecenie Przenieś, tylko z instancjami jednej z nich :(:
let f = FunctionCommand(commands: [MoveCommand(movingVector: .zero, condition: nil),
RotateCommand(side: .left, condition: nil)], condition: nil)
Każda pomoc będzie mile widziane
Aktualizacja. Ten artykuł bardzo mi pomógł wymyślić - https://krakendev.io/blog/generic-protocols-and-their-shortcomings
prostu ciekawi, dlaczego używasz konstrukcjom i protokoły gdy instacji byłoby łatwo rozwiązać ten problem? – Carter
@Carter Swift nie ma klas abstrakcyjnych, także Swift jest językiem zorientowanym na protokół, dlatego próbuję to zrobić za pomocą protokołu. –
Powiązane: [Operacja na tablicy struktur implementujących Równoważne] (http://stackoverflow.com/q/41298464/2976878) – Hamish