在 Swift 中实现 Objective-C 协议



我有一个在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参数感到不安。 这里使用的正确语法是什么?

我把你的协议放在一个项目中,并在<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 中将它们标记为nullable

@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 提供不同的接口。

最新更新