我有一个项目,我在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]
的方法