繁体   English   中英

在Swift中实现Objective-C协议

[英]Implementing an Objective-C protocol in Swift

我有一个在Objective-C中定义的协议,例如:

@protocol MyProtocol <NSObject>
- (void)doStuffWithDictionary:(NSDictionary*)dict 
                    andString:(NSString*)str1
            andOptionalString:(NSString*)str2
             andOptionalArray:(NSArray*)arr
                     callback:(void (^)(id result))onSuccess;
@end

...并且我正在尝试在Swift中定义一个实现此协议的类,例如:

class MyImpl : Operation, MyProtocol {
    func doStuff(withDictionary dict: [AnyHashable : Any]!, 
                      andString str1: String!, 
              andOptionalString str2: String? = nil, 
                andOptionalArray arr: NSArray? = nil, 
                  callback onSuccess: ((Any?) -> Void)! {
        ...
    }
}

但是我遇到了以下的构建错误:

Type 'MyImpl' does not conform to protocol 'MyProtocol'
note: candidate has non-matching type '([AnyHashable : Any]!, String!, String?, NSArray?, ((Any?) -> Void)!'
    func doStuff(withDictionary dict: [AnyHashable : Any]!, andString str1: String!, andOptionalString str2: String? = nil, andOptionalArray arr: NSArray? = nil, callback onSuccess: ((Any?) -> Void)!

似乎对andOptionalArray arr: NSArray? = nil很不高兴andOptionalArray arr: NSArray? = nil andOptionalArray arr: NSArray? = nil参数。 在这里使用正确的语法是什么?

我将您的协议放在一个项目中,并将其导入到<ProjectName>-Bridging-Header.h ,“ 自动完成”建议使用以下语法:

public func doStuff(with dict: [AnyHashable : Any],
               andString str1: String,
       andOptionalString str2: String,
         andOptionalArray arr: [Any],
           callback onSuccess: @escaping (Any) -> Void) {
}

如果希望将String[Any]作为可选导入,则需要在Objective-C中将它们标记为nullablenullable

@protocol MyProtocol <NSObject>
- (void)doStuffWithDictionary:(NSDictionary*)dict
                    andString:(NSString*)str1
            andOptionalString:(nullable NSString*)str2
             andOptionalArray:(nullable NSArray*)arr
                     callback:(void (^)(id result))onSuccess;
@end

正如@MartinR在评论中建议的那样:

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

这也可以工作,并为不同版本的Swift提供不同的接口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM