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;
}
NSNumber
与 initWithBool
的用法是 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
}
我有一个返回 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;
}
NSNumber
与 initWithBool
的用法是 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
}