No visible @interface for '***' declares the selector '***'

2020-12-09 11:02:23 浏览数 (1)

今天写代码遇到一个如下编译错误: No visible @interface for 'IVDevMgr' declares the selector 'setTimeZoneWithTimeZone:to:responseHandler:'

正常来说是一个很常见的bug,即

  • IVDevMgr这个类没有定义这个方法。
  • 引用Framework 的 searchPath 有问题。
  • 没有清除缓存
  • ...

但是之所以今天要在记录一下,是因为遇到了一种新的情况。。。。找了半天 IVDevMgr 是一个静态 Framework, 有如下方法:

代码语言:javascript复制
/// 设置设备时区
/// - Parameters:
///   - timeZone: 时区
///   - device: 设备id
///   - responseHandler: 回调
func setTimeZone(_ timeZone: Float, to device: String, responseHandler: ((_ error: Error?) -> Void)?) {
      ...
}

这是一个给设备设置时区的方法,很简单,代码中也正常使用:

代码语言:javascript复制
IVDevMgr.shared.setTimeZone(8, to: deviceId) { (error) in
   ...
}

之所以会遇到编译错误,是我在OC代码中使用了它

代码语言:javascript复制
[IVDevMgr.shareInstance setTimeZoneWithTimeZone:8 to:deviceId responseHandler:nil];

能正常联想,但是就编译报错,最坑的是另一个方法能够正常调用:

代码语言:javascript复制
/// 读取设备时区
/// - Parameters:
///   - device: 设备id
///   - responseHandler: 回调
func getTimeZone(of device: String, responseHandler: ((_ timeZone: Float, _ error: Error?) -> Void)?) {
    ...
}

即:

代码语言:javascript复制
[IVDevMgr.shareInstance getTimeZoneOf:device.contactId responseHandler:nil];

这个时候我真的是黑人问号了。。。

Why???

最终找到了元凶:“_” 你没看错,就是它,因为这个库是 Swift 写的,主要也是给Swift 调用,省略这个标签可以让代码好看且整洁,自然而然就这样用了。。。结果,

也许是Xcode的bug 吧, 直接去掉,OC代码不用动,正常编译~~~

0 人点赞