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

Objective-C声明全局可抛出Swift函数时NSError转throws遇阻求助

解决Objective-C函数映射Swift throws的问题

我之前也踩过类似的坑,咱们一步步来排查和修复:

首先你的函数声明里有个核心问题——NSError ** error没有标记为_Nonnull,而swift_error(nonnull_error)这个属性要求error参数本身必须是非空的(也就是调用者必须传入一个有效的NSError指针地址,不能传NULL),这是Swift能把它映射成throws语法的关键前提。

另外,你的返回值是_Nullable NSString *,如果这个函数在成功时一定会返回有效的字符串,建议把它改成_Nonnull,这样Swift里的返回类型就是非可选的String,更符合throws函数的常规设计逻辑(错误通过抛出传递,成功就返回确定的结果)。

修改后的Objective-C函数声明

NSString * _Nonnull revHashOfFile(NSURL * _Nonnull url, NSError ** _Nonnull error) 
__attribute__((swift_error(nonnull_error), swift_name("revHash(ofFile:)")));

还要注意这几个细节:

  • 桥接文件配置:确保包含这个函数声明的头文件已经添加到项目的桥接文件(比如YourProject-Bridging-Header.h)里,不然Swift根本识别不到这个函数。
  • 函数实现规范:严格遵循Obj-C的error模式编写实现:
    • 成功时:返回有效的字符串,同时把*error设为NULL
    • 失败时:返回nil(如果返回值保留nullable的话),并给*error赋值一个合法的NSError对象
  • 清理缓存重新编译:有时候Xcode的旧缓存会导致生成的Swift接口不符合预期,试试Product > Clean Build Folder后重新编译项目。

修改完成后,Swift里应该就能看到你预期的接口了:

public func revHash(ofFile url: URL) throws -> String

调用时就可以用标准的do-catch语法处理错误:

let fileURL = URL(fileURLWithPath: "/path/to/your/file")
do {
    let hash = try revHash(ofFile: fileURL)
    print("计算得到的哈希值:\(hash)")
} catch {
    print("出错了:\(error.localizedDescription)")
}

内容的提问来源于stack exchange,提问作者Linus Unnebäck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:22:04