Приложение с частичной функцией с генериками

Я работаю с Observer API ( ObserverSet), который имеет следующую функцию:

public func add<T: AnyObject>(object: T, _ f: T -> Parameters -> Void) -> ObserverSetEntry<Parameters>

Это просто зарегистрировать object затем вызовите метод экземпляра f на object когда срабатывает уведомление

В одном из моих менеджеров мне нужно скрыть предыдущую функцию с помощью одной из моих, чтобы я мог заставить наблюдателя вызывать предопределенную функцию, реализованную через протокол.

Вот что я сделал до сих пор:

@objc protocol Observer : NSObjectProtocol {
    func observe(param: String) -> Void
}

func addObserver<T: AnyObject where T: Observer>(observer: T) {
    let f: T -> String -> Void = observer.dynamicType.observe
    entries.addObserver(observer, f)
}

К сожалению, у меня появляется следующая ошибка Partial application of generic method is not allowed

Я нашел возможный обходной путь где-то на SO, который выглядит так:

let f: T -> String -> Void = { (obs: T) in obs.dynamicType.observe(obs) }

Но эта строка кода сводит мой XCode с ума Segmentation Fault: 11 на компиляции (и Communication interrupted с Playground..)

Есть ли обходной путь для того, что я пытаюсь сделать?

1 ответ

Решение

Я не проверял, но вы можете попробовать:

@objc protocol Observer : NSObjectProtocol {
    func observe(param: String) -> Void
}

func addObserver<T: AnyObject where T: Observer>(observer: T) {
    let f: T -> String -> Void = { ($0 as AnyObject).observe }
    entries.addObserver(observer, f)
}

По крайней мере, это компилируется, потому что AnyObject имеет все методы из ObjC - в том числе @objc - классы / протоколы, а ImplicitlyUnwrappedOptional,

Итак, это компилирует:

let str = NSString(string: "test")
(str as AnyObject).observe("foo")

Конечно, это вызывает ошибку во время выполнения, потому что NSString не имеет observe(_:) метод. Но, в вашем случае, T гарантированно будет Observer, это должно работать.

Другие вопросы по тегам