Swift中Objective-C SDK闭包类型别名定义问题求助
解决Swift中Objective-C SDK Completion Block的类型别名定义问题
首先,你的错误根源在于把闭包类型定义成了元组类型,而Objective-C的completionBlock在Swift中对应的是无返回值的闭包,不是元组。
错误原因分析
你之前的写法:
typealias SomethingSearchCompletionBlock = (result: Array<Something>?, error: Error?)
这定义的是一个包含两个可选值的元组类型,而不是可以被调用的闭包函数。所以当你尝试把它当作函数来调用时,就会触发Cannot call value of non-function type的错误——因为它本质上不是函数。
正确的类型别名写法
Objective-C中的SomethingCompletionBlock是一个接受NSArray<id<Something>>*和NSError*两个参数、无返回值的block,在Swift中对应的闭包类型需要加上-> Void来明确无返回值。你可以选择这几种写法:
- 不带参数标签的简洁写法:
typealias SomethingSearchCompletionBlock = ([Something]?, Error?) -> Void
- 带参数标签的写法(更清晰,和Objective-C的block签名对应):
typealias SomethingSearchCompletionBlock = (result: [Something]?, error: Error?) -> Void
- 显式添加下划线忽略外部标签(符合Swift闭包的常规写法):
typealias SomethingSearchCompletionBlock = (_ result: [Something]?, _ error: Error?) -> Void
正确的使用示例
定义好类型别名后,你可以这样在代码中使用:
// 假设你有一个这样的completionBlock参数 func handleFetchResult(completion: SomethingSearchCompletionBlock) { SDKService.fetchSomething(withModel: model) { result, error in // 直接传递结果给上层completion completion(result, error) } }
另外需要注意:Objective-C中的id<Something>协议对象,在Swift中会自动映射为遵循Something协议的类型,所以NSArray<id<Something>>*对应Swift的[Something]?是正确的。
内容的提问来源于stack exchange,提问作者Sazzad Hissain Khan
相关产品推荐
相关产品推荐

