Objective c 如何在Swift中执行memcmp()?

Objective c 如何在Swift中执行memcmp()?,objective-c,swift,Objective C,Swift,我正在尝试将我的一些代码从Objective-C转换为Swift。我遇到麻烦的一种方法是将CBUUID与UInt16进行比较。这在Objective-C中是相当直接的,但我很难想出一个在Swift中实现这一点的好方法 以下是Objective-C版本: /* * @method compareCBUUIDToInt * * @param UUID1 UUID 1 to compare * @param UUID2 UInt16 UUID 2 to compare * * @r

我正在尝试将我的一些代码从Objective-C转换为Swift。我遇到麻烦的一种方法是将
CBUUID
UInt16
进行比较。这在Objective-C中是相当直接的,但我很难想出一个在Swift中实现这一点的好方法

以下是Objective-C版本:

/*
 *  @method compareCBUUIDToInt
 *
 *  @param UUID1 UUID 1 to compare
 *  @param UUID2 UInt16 UUID 2 to compare
 *
 *  @returns 1 (equal) 0 (not equal)
 *
 *  @discussion compareCBUUIDToInt compares a CBUUID to a UInt16 representation of a UUID and returns 1
 *  if they are equal and 0 if they are not
 *
 */
-(int) compareCBUUIDToInt:(CBUUID *)UUID1 UUID2:(UInt16)UUID2 {
    char b1[16];
    [UUID1.data getBytes:b1];
    UInt16 b2 = [self swap:UUID2];
    if (memcmp(b1, (char *)&b2, 2) == 0) return 1;
    else return 0;
}
我在Swift中对该方法的(未经测试)版本变得更加复杂,我希望我只是错过了一些更好的使用该语言的方法:

func compareCBUUID(CBUUID1: CBUUID, toInt CBUUID2: UInt16) -> Int {
    let uuid1data = CBUUID1.data
    let uuid1count = uuid1data.length / sizeof(UInt8)
    var uuid1array = [UInt8](count: uuid1count, repeatedValue: 0)
    uuid1data.getBytes(&uuid1array, length: uuid1count * sizeof(UInt8))

    // @todo there's gotta be a better way to do this
    let b2: UInt16 = self.swap(CBUUID2)
    var b2Array = [b2 & 0xff, (b2 >> 8) & 0xff]
    if memcmp(&uuid1array, &b2Array, 2) == 0 {
        return 1
    }
    return 0
}
有两件事似乎使事情复杂化了。首先,无法在Swift中声明固定大小的缓冲区,因此ObjC中的
字符b1[16]
在Swift中变为3行。其次,我不知道用UInt16在Swift中执行
memcmp()
的方法。编译器抱怨:

'UInt16' is not convertible to '@value inout $T5'
这就是我手工将UInt16分离成字节数组的笨拙步骤


有什么建议吗?

字符b1[16]对应的Swift代码为

var b1 = [UInt8](count: 16, repeatedValue: 0)
对于字节交换,您可以使用“内置”方法
byteswaped
bigEndian
。 为
memcpy()
投射指针有点棘手

将Objective-C代码直接翻译成Swift(未经测试!):

但是,如果将
b1
定义为
UInt16
数组,则不需要
memcmp()

var b1 = [UInt16](count: 8, repeatedValue: 0)
CBUUID1.data.getBytes(&b1, length: sizeofValue(b1))
var b2: UInt16 = CBUUID2.bigEndian
if b1[0] == b2 {
    // ...
}

我喜欢!我不知道关于
byteSwapped
的事,很狡猾!
var b1 = [UInt16](count: 8, repeatedValue: 0)
CBUUID1.data.getBytes(&b1, length: sizeofValue(b1))
var b2: UInt16 = CBUUID2.bigEndian
if b1[0] == b2 {
    // ...
}