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

Swift4调用Objective-C带闭包的初始化方法时提示‘init’使用歧义

解决Swift 4中调用Objective-C闭包初始化方法时的“Ambiguous use of 'init'”错误

嘿,我来帮你搞定这个头疼的歧义错误!你遇到的这个问题,主要是Objective-C初始化方法的命名在Swift桥接时产生了识别混淆,加上闭包作为尾参数的写法细节,让Swift编译器没办法精准匹配到你要调用的初始化方法。下面给你两种可行的解决办法:

方法一:调整Objective-C初始化方法的命名(推荐)

按照Objective-C的命名规范,除了第一个参数外,后续参数的标签应该以小写字母开头,这样Swift桥接后的参数名会更清晰,从根源上避免歧义。修改你的OC代码如下:

typedef void (^updateCoordinate)(CLLocationCoordinate2D coordinate);
// 把Dragable改成dragable,参数名也统一成小写开头
- (instancetype)initWithCoordinate:(CLLocationCoordinate2D)coordinate dragable:(BOOL)dragable updateCoordinate:(updateCoordinate)updateCoordinate;

方法二:在Swift调用时明确指定所有外部参数名

如果不想修改OC代码,那就在Swift调用时把所有参数的外部名都明确写出来,别让编译器猜。比如:

let map = FAMapViewController(
    coordinate: CLLocationCoordinate2DMake(0, 0),
    dragable: true,
    updateCoordinate: { coordinate in
        // 这里写你的闭包处理逻辑,比如打印坐标
        print("新坐标:\(coordinate.latitude), \(coordinate.longitude)")
    }
)

这里要注意,别省略updateCoordinate这个参数名,哪怕它是最后一个闭包参数,明确写出后编译器就能准确识别对应的初始化方法了。

为什么会出现这个错误?

Swift对Objective-C的方法做桥接时,会自动把OC方法中参数标签的首字母转为小写(比如OC的Dragable:会变成Swift的dragable:)。如果你的OC类还有其他参数数量/类型相近的初始化方法,或者你调用时省略了部分外部参数名,编译器就会分不清你要调用哪个方法,从而抛出“Ambiguous use of 'init'”的错误。

内容的提问来源于stack exchange,提问作者Fadi Abuzant

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:38:47