gpt4 book ai didi

ios - 泛型的偏函数应用

转载 作者:搜寻专家 更新时间:2023-10-30 22:14:21 24 4
gpt4 key购买 nike

我正在使用具有以下功能的 Observer API ( ObserverSet):

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

它只是注册一个对象,然后在通知触发时调用对象上的实例方法f

在我的一个经理中,我需要用我的一个隐藏以前的函数,这样我就可以强制观察者调用通过协议(protocol)实现的预定义函数。

这是我到目前为止所做的:

@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 with Playground ..)

对于我正在尝试做的事情,是否有任何解决方法?

最佳答案

我还没有测试过,但你可以试试:

@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 - 类/协议(protocol),如 ImplicitlyUnwrappedOptional

所以,这个编译:

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

当然这会导致运行时错误,因为 NSString 没有 observe(_:) 方法。但是,在您的情况下,T 保证是 Observer,它应该可以工作。

关于ios - 泛型的偏函数应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28353539/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com