Я не уверен, как выполнить следующую работу. (Swift 3, XCode8).Привилегия общего типа в Swift 3
Я пытаюсь создать общий класс Node, который принимает объект состояния и/или каркасный объект как общие параметры, при этом объект состояния имеет ограничение протокола на наличие узла NodeState.
Я получаю следующее сообщение об ошибке:
Cannot convert value of type Node<State, Wireframe> to type Node<_,_> in coercion
С помощью следующего кода (должен работать в Playground):
import Foundation
public protocol NodeState {
associatedtype EventType
associatedtype WireframeType
mutating func action(_ event: EventType, withNode node: Node<Self, WireframeType>)
}
extension NodeState {
mutating public func action(_ event: EventType, withNode node: Node<Self, WireframeType>) { }
}
public class Node<State: NodeState, Wireframe> {
public var state: State
public var wireframe: Wireframe?
public init(state: State, wireframe: Wireframe?) {
self.state = state
guard wireframe != nil else { return }
self.wireframe = wireframe
}
public func processEvent(_ event: State.EventType) {
DispatchQueue.main.sync { [weak self] in
// Error presents on the following
let node = self! as Node<State, State.WireframeType>
self!.state.action(event, withNode: node)
}
}
}
Любая помощь будет принята с благодарностью. Благодаря!
UPDATE:
следующие работы - когда я удалить ссылки каркасные:
import Foundation
public protocol NodeState {
associatedtype EventType
mutating func action(_ event: EventType, withNode node: Node<Self>)
}
extension NodeState {
mutating public func action(_ event: EventType, withNode node: Node<Self>) { }
}
public class Node<State: NodeState> {
public var state: State
public init(state: State) {
self.state = state
}
public func processEvent(_ event: State.EventType) {
DispatchQueue.main.sync { [weak self] in
self!.state.action(event, withNode: self!)
}
}
}
Теперь, как добавить параметр для добавления родового объекта Wireframe к классу Node?
Зачем вам нужен отдельный параметр «Wireframe»? Не можете ли вы просто использовать тип 'State.WireframeType' в своем классе? – Hamish
Спасибо Хэмиш, что работает. –