4
我想將我的一些代碼從Objective-C轉換爲Swift。我遇到麻煩的一種方法是將CBUUID
與UInt16
進行比較。這在Objective-C中是相當直接的,但我很難想出一個在Swift中做到這一點的好方法。如何在Swift中執行memcmp()?
下面是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;
}
我的(未經測試)版本得到了更爲複雜,我希望,我只是缺少一些更好的方法來使用的語言:
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行。其次,我不知道如何用UInt16在Swift中執行memcmp()
。編譯器會抱怨:
'UInt16' is not convertible to '@value inout $T5'
所以這就是笨重的步驟,我將UInt16手工分離出來的字節數組。
有什麼建議嗎?
我挖了它!我不知道'byteSwapped'的東西,非常漂亮! – 2014-10-09 20:46:24