如何在Swift中键入提示并返回从Objective到Swift的整数数组?
在Swift:
var x: [Int]
x = some.data()
在目标C中,如果data()
被定义为:
- (NSArray<NSInteger> *)data;
Xcode给出一个错误type argument 'NSInteger' (aka 'long') is neither an Objective-C object nor a block type
如果data()
定义为:
- (NSArray<NSNumber *> *)data;
Xcode给出一个错误Cannot assign value of type '[NSNumber]' to type '[Int]'
如果data()
定义为:
- (NSArray *)data;
Xcode给出一个错误Cannot assign value of type '[Any]' to type '[Int]'
有办法在目标C中键入整数数组吗?
发布于 2022-09-05 09:21:45
NSArray
必须包含像NSNumber
这样的对象,不支持像NSinteger
这样的标量类型。
所以你必须定义
- (NSArray<NSNumber *> *)data;
在Swift方面,只需强制将数组桥接到[Int]
var x: [Int]
x = some.data() as! [Int]
发布于 2022-09-05 09:40:27
苹果并没有给出Objective/ Swift互操作性的精确类型匹配表,但是,如果您试图将具有[Int]
属性的Swift类转换为Objective,您将得到NSArray<NSNumber *> * _Nonnull
类型:
class SwiftObject: NSObject {
@objc
var array: [Int] = []
}
目标-C生成类:
SWIFT_CLASS("_TtC14ObjCPlayground11SwiftObject")
@interface SwiftObject : NSObject
@property (nonatomic, copy) NSArray<NSNumber *> * _Nonnull array;
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end
因此,我认为您的第二种方法是正确的,互操作性机制无法更好地生成Swift类,因为无法通知它NSNumber
是目标C中数组内部的int
类型。因此,您不能完全依赖生成的代码为您提供所需的方法返回类型。解决这个问题的最简单方法是手动调整Swift代码中的类型:
var x: [Int]
x = some.data().map { $0.intValue }
另一种选择是改进Swift实现的方法,并手动添加转换部分作为扩展。在Objective类方法声明中添加NS_REFINED_FOR_SWIFT
宏:
@interface TDWSwiftRefinedClass : NSObject
- (NSArray<NSNumber *> * _Nonnull)data NS_REFINED_FOR_SWIFT;
...
然后在Swift代码中的某个地方扩展类,如下所示:
extension TDWSwiftRefinedClass {
func data() -> [Int] {
__data().map { $0.intValue }
}
}
https://stackoverflow.com/questions/73606900
复制相似问题