Я пытаюсь создать протокол (AppStore), который требует, чтобы конформер реализовал массив элементов (подписки), соответствующих протоколу (подписчику), который имеет связанный тип.Как определить протокол с массивом протокола с ассоциированным типом
цель Вы можете думать о AppStore как о NSNotificationCenter. Я хочу добавить подписчиков (например, addObserver ...). Когда что-то происходит, вызовите handleNewState на подписчиков (например, handleNotification :) и передайте конформер AppState, на котором на самом деле есть некоторые переменные, установленные на нем. У AppState нет доступных свойств.
public protocol AppStore {
//trying to have an array of subscriptions in the protocol
//but a concrete Subscriber type needs to be specified, I thought a generic Subscriber would be more flexible here?
var subscriptions:[Subscription<>]{get set}// Reference to generic type 'Subscription' requires arguments in <...>
associatedtype AppStateType:AppState
var appState:AppStateType { get set }
}
extension AppStore {
//so that AppStore can implement this function
public mutating func subscribe<T:protocol<Subscriber, AnyObject>>(aSubscriber:T){
subscriptions.append(Subscription(sub:aSubscriber))
}
}
public protocol Subscriber {
associatedtype AppStateType
func handleNewState(newState:AppStateType)
}
public struct Subscription <T:protocol<Subscriber, AnyObject>> {
private weak var subscriber:T? = nil
init(sub:T){
self.subscriber = sub
}
}
public protocol AppState { }
Как я должен определить var subscriptions:[Subscription<>]?
Или я должен делать это по-другому
Я хотел бы использовать его как этот
public struct OSXAppState:AppState {
var someStateProp:Int = 0
}
extension NSView : Subscriber {
public func handleNewState(newState:OSXAppState){
if newState == 1 { //do this }
else { //do that }
}
}
public struct OSXAppStore : AppStore {
public typealias GenericSubscriber = NSView//???: something more generic "anything that implements Subscriber"
public var subscriptions: [Subscription<GenericSubscriber>] = []
public var appState: AppState = OSXAppState()
}
Опишите больше о вашей цели. Какую проблему вы пытаетесь решить с помощью этого кода? Это может быть не самый прямой путь к этой цели. – ColGraff