gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:35:30 24 4
gpt4 key购买 nike

我正在尝试将我的一些代码从 Objective-C 转换为 Swift。我遇到问题的一种方法是将 CBUUIDUInt16 进行比较。这在 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 中的 char b1[16] 在 Swift 中变成了 3 行。其次,我不知道在 Swift 中使用 UInt16 执行 memcmp() 的方法。编译器提示说:

'UInt16' is not convertible to '@value inout $T5'

这就是笨拙的步骤所在,我将 UInt16 手动分离成一个字节数组。

有什么建议吗?

最佳答案

char b1[16] 对应的 Swift 代码是

var b1 = [UInt8](count: 16, repeatedValue: 0)

对于字节交换,您可以使用“内置”方法byteSwappedbigEndian。为 memcpy() 转换指针有点棘手。

将您的 Objective-C 代码直接转换为 Swift 将是(未经测试!):

var b1 = [UInt8](count: 16, repeatedValue: 0)
CBUUID1.data.getBytes(&b1, length: sizeofValue(b1))
var b2: UInt16 = CBUUID2.byteSwapped
// Perhaps better:
// var b2: UInt16 = CBUUID2.bigEndian
if memcmp(UnsafePointer(b1), UnsafePointer([b2]), 2) == 0 {
// ...
}

但是,如果将 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 {
// ...
}

关于objective-c - 如何在 Swift 中执行 memcmp()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26286763/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com