KMM中Swift调用Kotlin数据类报错:init()不可用
问题原因
- Kotlin/Native构造函数暴露规则:你定义的
GeoPoint是带默认参数的Kotlin data类,在Kotlin层面可以直接调用无参构造,但Kotlin/Native向Swift暴露API时,不会自动将带默认参数的主构造映射为Swift的无参构造器——Swift仅能识别显式定义的构造函数。 - 列表初始化的特殊性:你能正常实例化
GeoPoint列表(比如[GeoPoint]()),是因为这是Swift自身的空数组初始化逻辑,并未创建GeoPoint实例,因此和GeoPoint的构造函数无关。
解决方法
方法一:在Kotlin中显式添加无参构造函数
在共享模块的GeoPoint类里添加次级构造,调用主构造的默认值,让Swift能识别到无参构造:
@Serializable data class GeoPoint( var latitude: Double = 0.0, var longitude: Double = 0.0 ) { // 显式定义无参构造,供Swift调用 constructor() : this(0.0, 0.0) }
重新编译共享模块后,Swift代码里就能正常使用GeoPoint()实例化对象。
方法二:Swift中直接调用带参数的构造(临时替代方案)
如果不想修改Kotlin代码,也可以在Swift里传入默认值完成初始化:
@State var myGeopoint = GeoPoint(latitude: 0.0, longitude: 0.0)
但这种方式不如添加无参构造简洁。
内容的提问来源于stack exchange,提问作者dhaval123
相关产品推荐
相关产品推荐

