0

Я не уверен, как выполнить следующую работу. (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?

+0

Зачем вам нужен отдельный параметр «Wireframe»? Не можете ли вы просто использовать тип 'State.WireframeType' в своем классе? – Hamish

+0

Спасибо Хэмиш, что работает. –

ответ

0

Применение, которое я подозреваю, дает ответ Хэмиша, который теперь компилируется, как ожидалось. Благодаря!

import Foundation 

public protocol NodeState { 

    associatedtype EventType 
    associatedtype WireframeType 

    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 var wireframe: State.WireframeType? 

    public init(state: State, wireframe: State.WireframeType?) { 

     self.state = state 

     guard wireframe != nil else { return } 
     self.wireframe = wireframe 

    } 

    public func processEvent(_ event: State.EventType) { 

     DispatchQueue.main.sync { [weak self] in 

      self!.state.action(event, withNode: self!) 

     } 

    } 

}