首页 > 解决方案 > 使用 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-cswiftkotlinkotlin-multiplatformkotlin-native

解决方案


最接近您的函数转换为 Objective C 的内容类似于:

- (NSNumber * _Nullable)getBoolOrNil {
    if(something) {
        return [NSNumber numberWithBool:YES];
    }
    return NULL;
}

NSNumberwith的用法是在 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
}

推荐阅读