You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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来明确无返回值。你可以选择这几种写法:

  1. 不带参数标签的简洁写法:
typealias SomethingSearchCompletionBlock = ([Something]?, Error?) -> Void
  1. 带参数标签的写法(更清晰,和Objective-C的block签名对应):
typealias SomethingSearchCompletionBlock = (result: [Something]?, error: Error?) -> Void
  1. 显式添加下划线忽略外部标签(符合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:11:30