2014-10-09 21 views
4

我想将我的一些代码从Objective-C转换为Swift。我遇到麻烦的一种方法是将CBUUIDUInt16进行比较。这在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手工分离出来的字节数组。

有什么建议吗?

回答

2

char b1[16]对应的银行代码将

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

和字节交换,你可以使用“内置”的方法byteSwappedbigEndian。 铸造指针memcpy()有点棘手。

你的Objective-C代码斯威夫特直接翻译将是(未经测试!):

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 { 
    // ... 
} 
+0

我挖了它!我不知道'byteSwapped'的东西,非常漂亮! – 2014-10-09 20:46:24