首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将整数数组从目标C连接到Swift?

如何将整数数组从目标C连接到Swift?
EN

Stack Overflow用户
提问于 2022-09-05 09:00:53
回答 2查看 117关注 0票数 0

如何在Swift中键入提示并返回从Objective到Swift的整数数组?

在Swift:

代码语言:javascript
运行
复制
var x: [Int]
x = some.data()

在目标C中,如果data()被定义为:

代码语言:javascript
运行
复制
- (NSArray<NSInteger> *)data;

Xcode给出一个错误type argument 'NSInteger' (aka 'long') is neither an Objective-C object nor a block type

如果data()定义为:

代码语言:javascript
运行
复制
- (NSArray<NSNumber *> *)data;

Xcode给出一个错误Cannot assign value of type '[NSNumber]' to type '[Int]'

如果data()定义为:

代码语言:javascript
运行
复制
- (NSArray *)data;

Xcode给出一个错误Cannot assign value of type '[Any]' to type '[Int]'

有办法在目标C中键入整数数组吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-05 09:21:45

NSArray必须包含像NSNumber这样的对象,不支持像NSinteger这样的标量类型。

所以你必须定义

代码语言:javascript
运行
复制
- (NSArray<NSNumber *> *)data;

在Swift方面,只需强制将数组桥接到[Int]

代码语言:javascript
运行
复制
var x: [Int]
x = some.data() as! [Int]
票数 2
EN

Stack Overflow用户

发布于 2022-09-05 09:40:27

苹果并没有给出Objective/ Swift互操作性的精确类型匹配表,但是,如果您试图将具有[Int]属性的Swift类转换为Objective,您将得到NSArray<NSNumber *> * _Nonnull类型:

代码语言:javascript
运行
复制
class SwiftObject: NSObject {
    
    @objc
    var array: [Int] = []
    
}

目标-C生成类:

代码语言:javascript
运行
复制
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代码中的类型:

代码语言:javascript
运行
复制
var x: [Int]
x = some.data().map { $0.intValue }

另一种选择是改进Swift实现的方法,并手动添加转换部分作为扩展。在Objective类方法声明中添加NS_REFINED_FOR_SWIFT宏:

代码语言:javascript
运行
复制
@interface TDWSwiftRefinedClass : NSObject

- (NSArray<NSNumber *> * _Nonnull)data NS_REFINED_FOR_SWIFT;
...

然后在Swift代码中的某个地方扩展类,如下所示:

代码语言:javascript
运行
复制
extension TDWSwiftRefinedClass {
    
    func data() -> [Int] {
        __data().map { $0.intValue }
    }
    
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73606900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档