我应该使用什么数据类型转换字节数组从Swift到Objective-C



我有一个项目,我在Swift中编写生产代码,在Objective-C中编写单元测试(因为我使用OCMock,我在Objective-C中编写测试)。

我要做的是写一个Buffer对象,其中writeBytes方法需要一个Byte数组和一个长度,像这样:

func writeBytes(data: [Byte], length: Int)
在我的单元测试目标中,我想测试这个方法,但问题是它不会将这个方法转换为Objective-C。通过查看我的-Swift.h文件,我看到以下内容:
@interface Buffer : Object
@property (nonatomic) NSInteger capacity;
@property (nonatomic) NSInteger size;
- (instancetype)initWithCapacity:(NSInteger)capacity OBJC_DESIGNATED_INITIALIZER;
- (void)reset;
- (NSInteger)size;
- (BOOL)isFilled;
- (BOOL)isEmpty;
@end

可以看到缺少writeBytes方法。我尝试了不同的数据类型,看看它是否出现:UInt8, UnsafePointer<UInt8>,但它们都不起作用。

为了调试,我尝试使用String数组,它被转换为Objective-C没有任何问题。

我应该为我的Byte数组使用什么数据类型使writeBytes方法在Objective-C中可用?

Swift类型[Byte]在Objective-C中是不可表示的,但你可以使用指向字节的指针:

func writeBytes(data: ConstUnsafePointer<Byte>, length: Int) { ... }
var data : [Byte] = [1, 2, 3]
writeBytes(data, length: data.count)

映射到Objective-C为

- (void)writeBytes:(Byte const *)data length:(NSInteger)length;

这样你就可以把它命名为

Byte data[] = {1, 2, 3};
[buffer writeBytes:data length:3];

使用NSData。你可以从Swift中的[UInt8]数组中创建一个:

import Foundation
var u8s = [UInt8]()
// ...
var data = NSData(bytes:&u8s, length:u8s.count)

仅供参考,这与Swift相反-从ConstUnsafePointer<()>提问者正在寻找将NSData转换为[UInt8]的方法

最新更新