iOS11 Swift 4-如何检查Swift类是否符合Objective-C中定义的协议?

时间:2018-08-24 11:47:30

标签: objective-c swift swift4 protocols ios11

我有一个旧代码库,其中包含用Objective-C编写的代码。我要添加一个用Swift编写的新类,该类必须符合Objective-C中定义的现有协议。

如何确保我的Swift类正确实现了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?
    }
    }

2 个答案:

答案 0 :(得分:2)

确保将协议定义文件#import放入<ProjectName>-Bridging-Header.h文件中:

#import "OBJCLocationObserver.h"

然后,如果您的签名不匹配,您应该会看到错误消息。

您还可以使用Xcode 自动完成。类型:

public func didUpdateLocation

自动完成建议:

public func didUpdateLocation(withModel Model?, lastLocation: CLLocationCoordinate2D)

与您现有的不同,并说明为什么它不起作用。


这是获取界面的另一种方法:

@MartinR在对另一个问题的评论中建议:

  

转到定义协议的头文件,然后选择   左上角“相关项目”弹出窗口中的“生成的接口”   角。这将向您显示确切的Swift方法签名   必须实施。

答案 1 :(得分:2)

[MyClass conformsToProtocol:@protocol(MyProtocol)];

根据Apple Docs,您可以使用conformsToProtocol:返回一个布尔值,该值指示接收者是否符合给定的协议。


示例

@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))