【问题标题】:iOS11 Swift 4 - how to check if Swift class conforms to protocol defined in Objective-C?iOS11 Swift 4 - 如何检查 Swift 类是否符合 Objective-C 中定义的协议?
【发布时间】:2018-08-24 11:47:29
【问题描述】:

我有一个旧代码库,其中包含用 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?
    }
    }

【问题讨论】:

    标签: objective-c swift swift4 protocols ios11


    【解决方案1】:
    [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))
    

    【讨论】:

      【解决方案2】:

      确保将您的#import 协议定义文件放入&lt;ProjectName&gt;-Bridging-Header.h 文件中:

      #import "OBJCLocationObserver.h"
      

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

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

      public func didUpdateLocation
      

      并且自动完成建议:

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

      这与您所拥有的不同,并解释了它为什么不起作用。


      这里是另一种获取接口的方法:

      正如@MartinR 对另一个问题的评论所建议的那样:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-24
        • 2015-09-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多