今天写代码遇到一个如下编译错误:
No visible @interface for 'IVDevMgr' declares the selector 'setTimeZoneWithTimeZone:to:responseHandler:'
正常来说是一个很常见的bug,即
-
IVDevMgr
这个类没有定义这个方法。 - 引用Framework 的 searchPath 有问题。
- 没有清除缓存
- ...
但是之所以今天要在记录一下,是因为遇到了一种新的情况。。。。找了半天
IVDevMgr
是一个静态 Framework, 有如下方法:
/// 设置设备时区
/// - 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代码不用动,正常编译~~~