objective-c - 使用 Kotlin 本机和 ObjectiveC/Swift 的 Optionals/Nullables
问题描述
我有一个返回 Nullable 的 kotlin 函数,如下所示:
fun getBoolOrNil(): Boolean? {
if (something){
return true
}
return null
}
然后我将它与 iOs 的 ObjectiveC 原生的 kotlin 进行交叉编译,但是我与 objC/swift 一起使用的结果库中的方法返回
__attribute__((swift_name("KotlinBoolean")))
@interface MyLibBoolean : MyLibNumber
- (instancetype)initWithBool:(BOOL)value;
+ (instancetype)numberWithBool:(BOOL)value;
@end;
而 MyLibNumber 只是一个
@interface MyLibNumber : NSNumber
...
这是交叉编译器试图给我一些我可以使用的东西,比如 Optional/Nullable 还是这个对象不能用于这个目的?我知道 ObjectiveC 不支持 Optionals/Nullables,但我不明白交叉编译器在这里给我的这个对象。
解决方案
最接近您的函数转换为 Objective C 的内容类似于:
- (NSNumber * _Nullable)getBoolOrNil {
if(something) {
return [NSNumber numberWithBool:YES];
}
return NULL;
}
NSNumber
with的用法是在 Objective-C 中表达可空布尔值initWithBool
的常见模式。这就是你的交叉编译器所做的,除了它还创建了一个包装器NSNumber
,现在顶部的相同函数可以表示为:
- (MyLibBoolean * _Nullable)getBoolOrNil {
if(something) {
return [MyLibBoolean numberWithBool:YES];
}
return NULL;
}
当然,在 Swift 中,不需要整个包装,该函数看起来与 kotlin 中的几乎完全相同:
func getBoolOrNil() -> Bool? {
if something {
return true
}
return nil
}
推荐阅读
- python - 在 Keras 中可视化层的输出
- html - 让文本和图像彼此相邻浮动
- node.js - 通过 cron 作业运行 ts-node
- arrays - 循环遍历 2D 数组以更改 Kotlin 中的所有元素
- vue.js - Nuxt.js:在每个页面上为移动/桌面使用替代布局
- lua - ComputerCraft 采矿龟不会停止向下挖掘
- javascript - 比较两个对象并获取公共值 JavaScript
- r - 将列添加到具有多个字符串作为条件的数据框
- grails - 如何自定义脚手架生成的 Grails 默认 CRUD 代码模板(如 GSP、Controller、Service 和 Specification 模板)?
- r - 如何按给定值(沉积物核心中的深度)而不是按顺序绘制树状图叶子?