2014-11-05 2 views
1

Итак, я играю с использованием дженериков в Swift для создания KVO-подобных функций, но я получаю эту ошибку, и я просто не могу понять, почему:Generics 'не идентичен' ошибке

error message

Это весь код:

struct Observable<T> { 
    typealias ValueType = T 
    typealias SubscriptionType = Subscription<T> 

    var value: ValueType { 
     didSet { 
      let event = ValueChangeEvent(oldValue, value) 
      self.subscriptions.notify(event) 
     } 
    } 

    var subscriptions = Subscriptions<SubscriptionType>() 

    init(_ value: ValueType) { 
     self.value = value 
    } 
} 

struct ValueChangeEvent<T> { 
    typealias ValueType = T 

    let oldValue: ValueType 
    let newValue: ValueType 

    init(_ o: ValueType, _ n: ValueType) { 
     oldValue = o 
     newValue = n 
    } 
} 

class Subscription<T> { 
    typealias ValueType = T 
    typealias HandlerType = (oldValue: ValueType, newValue: ValueType) ->() 

    let handler: HandlerType 

    init(handler: HandlerType) { 
     self.handler = handler 
    } 

    func notify(event: ValueChangeEvent<ValueType>) { 
     self.handler(oldValue: event.oldValue, newValue: event.newValue) 
    } 
} 

struct Subscriptions<T> { 
    typealias ValueType = T 
    typealias SubscriptionType = Subscription<T> 

    private var subscriptions = Array<SubscriptionType>() 

    mutating func add(handler: SubscriptionType.HandlerType) -> SubscriptionType { 
     let subscription = Subscription(handler: handler) 
     self.subscriptions.append(subscription) 
     return subscription 
    } 

    mutating func remove(subscription: SubscriptionType) { 
     var index = NSNotFound 
     var i = 0 
     for element in self.subscriptions as [SubscriptionType] { 
      if element === subscription { 
       index = i 
       break 
      } 
      i++ 
     } 

     if index != NSNotFound { 
      self.subscriptions.removeAtIndex(index) 
     } 
    } 

    func notify(event: ValueChangeEvent<ValueType>) { 
     for subscription in subscriptions { 
      subscription.notify(event) 
     } 
    } 
} 

Любая помощь будет оценена.

ответ

1

Основываясь на том, что я вижу, это выглядит как subscriptions свойство Observable<T> неправильно определено:

var subscriptions = Subscriptions<SubscriptionType>() 

тогда он должен быть:

var subscriptions = Subscriptions<ValueType>() 

Я не копаться в логике, поэтому я не могу сказать, если с этим изменения ваш код все еще работает - если это не так, это хорошая отправная точка для вас, чтобы выяснить, что не так.

Смежные вопросы