Приложение с частичной функцией с генериками
Я работаю с 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
, это должно работать.