Optionals/Nullables 使用 Kotlin 原生和 ObjectiveC/Swift

Optionals/Nullables with Kotlin native and ObjectiveC/Swift

我有一个返回 Nullable 的 kotlin 函数,如下所示:

fun getBoolOrNil(): Boolean? {
    if (something){
        return true
    }
    return null
}

然后我将它与 objectiveC 原生的 kotlin 交叉编译为 iOs,但是我在 objC/swift returns

中使用的结果库中的方法
__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,但我不理解 Crosscompiler 在这里给我的这个对象。

最接近您的函数转换为 Objective C 的是:

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

NSNumberinitWithBool 的用法是 common pattern 在 Objective-C 中表达可空布尔值。 这就是你的交叉编译器所做的,除了它还为 NSNumber 创建了一个包装器,现在顶部的相同函数可以表示为:

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

当然在 Swift 中不需要整个包装,函数看起来与 kotlin 中几乎完全相同:

func getBoolOrNil() -> Bool? {
    if something {
        return true
    }
    return nil
}