iOS11 Swift 4 - 如何检查 Swift class 是否符合 Objective-C 中定义的协议?
iOS11 Swift 4 - how to check if Swift class conforms to protocol defined in Objective-C?
我有一个遗留代码库,其中的代码是用 Objective-C 编写的。我正在添加一个用 Swift 编写的新 class,它必须符合 Objective-C.
中定义的现有协议
如何确保我的 Swift class 正确实现了 Objective-C 协议中定义的方法?
//In Obj-C
@protocol OBJCLocationObserver <NSObject>
- (void)didUpdateLocationWithModel:(nullable Model *)locationModel
lastLocation:(CLLocationCoordinate2D)lastLocation;
@end
//In Swift
extension SwiftLocationManager : OBJCLocationObserver
{
public func didUpdateLocation(with model: Model?, lastLocation: CLLocationCoordinate2D) {
// How to verify this function signature is actually conforming to the Obj-C protocol and is not a new method?
}
}
确保您 #import
将您的协议定义文件放入 <ProjectName>-Bridging-Header.h
文件:
#import "OBJCLocationObserver.h"
然后如果您的签名不匹配,您应该会看到错误消息。
您还可以使用Xcode 自动完成。类型:
public func didUpdateLocation
和自动完成建议:
public func didUpdateLocation(withModel Model?, lastLocation: CLLocationCoordinate2D)
这与您所拥有的不同,并解释了为什么它不起作用。
这是获取接口的另一种方法:
正如@MartinR 在对另一个问题的评论中所建议的那样:
Go to the header file where the protocol is defined, and choose
"Generated Interface" from the "Related Items" popup in the top-left
corner. That will show you the exact Swift method signature that you
have to implement.
[MyClass conformsToProtocol:@protocol(MyProtocol)];
根据Apple Docs,您可以使用conformsToProtocol:
其中returns一个布尔值,指示接收方是否符合给定协议。
例子
@protocol MyProtocol
- (void)helloWorld;
@end
@interface MyClass : NSObject <MyProtocol>
@end
将暴露为:
console.log(MyClass.conformsToProtocol(MyProtocol));
var instance = MyClass.alloc().init();
console.log(instance.conformsToProtocol(MyProtocol))
我有一个遗留代码库,其中的代码是用 Objective-C 编写的。我正在添加一个用 Swift 编写的新 class,它必须符合 Objective-C.
中定义的现有协议如何确保我的 Swift class 正确实现了 Objective-C 协议中定义的方法?
//In Obj-C
@protocol OBJCLocationObserver <NSObject>
- (void)didUpdateLocationWithModel:(nullable Model *)locationModel
lastLocation:(CLLocationCoordinate2D)lastLocation;
@end
//In Swift
extension SwiftLocationManager : OBJCLocationObserver
{
public func didUpdateLocation(with model: Model?, lastLocation: CLLocationCoordinate2D) {
// How to verify this function signature is actually conforming to the Obj-C protocol and is not a new method?
}
}
确保您 #import
将您的协议定义文件放入 <ProjectName>-Bridging-Header.h
文件:
#import "OBJCLocationObserver.h"
然后如果您的签名不匹配,您应该会看到错误消息。
您还可以使用Xcode 自动完成。类型:
public func didUpdateLocation
和自动完成建议:
public func didUpdateLocation(withModel Model?, lastLocation: CLLocationCoordinate2D)
这与您所拥有的不同,并解释了为什么它不起作用。
这是获取接口的另一种方法:
正如@MartinR 在对另一个问题的评论中所建议的那样:
Go to the header file where the protocol is defined, and choose "Generated Interface" from the "Related Items" popup in the top-left corner. That will show you the exact Swift method signature that you have to implement.
[MyClass conformsToProtocol:@protocol(MyProtocol)];
根据Apple Docs,您可以使用conformsToProtocol:
其中returns一个布尔值,指示接收方是否符合给定协议。
例子
@protocol MyProtocol
- (void)helloWorld;
@end
@interface MyClass : NSObject <MyProtocol>
@end
将暴露为:
console.log(MyClass.conformsToProtocol(MyProtocol));
var instance = MyClass.alloc().init();
console.log(instance.conformsToProtocol(MyProtocol))