获取ARSessionDelegate方法Selector时遇表达式歧义错误求助
解决ARSessionDelegate可选方法Selector歧义问题
你遇到的“Type of expression is ambiguous without more context”错误,根源是对协议中可选方法的Selector写法不符合Swift编译器的解析逻辑,尤其是你加的复杂类型转换反而让编译器无法明确识别。
正确的Selector写法
简化版(推荐,大部分场景适用)
直接通过协议名调用方法名即可,不需要额外的类型转换:
#selector(ARSessionDelegate.session(_:didUpdate:))
明确类型版(针对编译器仍有歧义的情况)
如果必须指定类型,要注意可选方法的函数类型是带可选标记的(Void?),因为可选方法本身可能未被实现:
#selector((ARSessionDelegate.session(_:didUpdate:)) as (ARSessionDelegate) -> (ARSession, ARFrame) -> Void?)
Rx扩展中的实际用法示例
给ARKit会话写Rx扩展时,用RxCocoa的delegate.methodInvoked方法会更省心,它已经处理了可选方法的调用逻辑,示例代码如下:
import RxSwift import RxCocoa import ARKit extension Reactive where Base: ARSession { var didUpdateFrame: Observable<ARFrame> { return delegate.methodInvoked(#selector(ARSessionDelegate.session(_:didUpdate:))) .map { parameters in return parameters[1] as! ARFrame } } }
内容的提问来源于stack exchange,提问作者Artem
相关产品推荐
相关产品推荐

