【问题标题】:Optionals/Nullables with Kotlin native and ObjectiveC/Swift使用 Kotlin 本机和 ObjectiveC/Swift 的 Optionals/Nullables
【发布时间】:2021-03-07 18:10:59
【问题描述】:

我有一个返回 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,但我不明白 Crosscompiler 在这里给我的这个 Object。

【问题讨论】:

    标签: objective-c swift kotlin kotlin-multiplatform kotlin-native


    【解决方案1】:

    你的函数最接近于 Objective C 是这样的:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多