2014-12-04 23 views
2

在我原来的职位的延续:Using Structs (Bytes) with SWIFT - Struct to NSData and NSData to Struct使用的Structs(包括字节数组)与SWIFT - 结构来NSData的和NSData的以结构

现在我发现,如果我有个字节的结构与字节数组混合它没有正确打包。

例如代码:

struct exampleStruct { 
    var ModelNumber: Byte 
    var MajorVersion: Byte 
    var MinorVersion: Byte 
    var Revision: Byte 
    var Message: [Byte] 
} 

var myStruct = exampleStruct (
    ModelNumber: 1, 
    MajorVersion: 2, 
    MinorVersion: 3, 
    Revision: 4, 
    Message: [0x48, 0x45, 0x4C, 0x4C, 0x4F] // HELLO 
) 

println(myStruct.Message)返回正确阵列的[72,69,76,76,79]

然而,值时,我这个结构转换为NSData的使用:

// Struct to NSData. 
var data = NSData(
    bytes: & myStruct, 
    length: sizeof(exampleStruct) 
) 

我得到意想不到的结果: “data:< 01020304 00000000 108c91fd a87f0000>”。我期待“数据:< 01020304 48454c4c 4f>”

这似乎是因为没有设置[字节]数组长度。它可以在SWIFT中设置吗?当我尝试以下操作:

struct exampleStruct { 
    var ModelNumber: Byte 
    var MajorVersion: Byte 
    var MinorVersion: Byte 
    var Revision: Byte 
    var Message: Byte[5] // << Set array length 5 
} 

我收到一条警告,指出:“固定长度数组尚未支持”。

无论如何要解决这个限制?

+0

'[Byte]'是一个Swift'结构数组'而不是C数组。 – 2014-12-04 21:11:09

回答

2
var Message: [Byte]

声明类型struct Array的变量:

struct Array<T> : MutableCollectionType, Sliceable { 

    /// The type of element stored by this `Array` 
    typealias Element = T 

    /// Always zero, which is the index of the first element when non-empty. 
    var startIndex: Int { get } 

    /// A "past-the-end" element index; the successor of the last valid 
    /// subscript argument. 
    var endIndex: Int { get } 
    subscript (index: Int) -> T 

    // ... and much more ... 
} 

所以这不仅是一个 “C数组” 的字节。实际的存储空间是不透明的,只有通过方法和属性才可以访问 。

您可以定义固定大小的元组

struct exampleStruct { 
    var ModelNumber: Byte 
    var MajorVersion: Byte 
    var MinorVersion: Byte 
    var Revision: Byte 
    var Message: (Byte, Byte, Byte, Byte, Byte) 
} 

var myStruct = exampleStruct (
    ModelNumber: 1, 
    MajorVersion: 2, 
    MinorVersion: 3, 
    Revision: 4, 
    Message: (0x48, 0x45, 0x4C, 0x4C, 0x4F) // HELLO 
) 
var data = NSData(
    bytes: &myStruct, 
    length: sizeof(exampleStruct) 
) 

println(data) // <01020304 48454c4c 4f> 

不过,我不认为斯威夫特有关其结构的二进制表示 任何保证,所以这可能会在未来突破。

+0

这太棒了 - 谢谢!出于某种原因,我一直认为SWIFT比C实际更类似于C。 – Mavro 2014-12-04 21:59:59

+0

@Mavro:不客气。 - 如果你需要一个定义良好的表示(例如用于数据交换),那么通过定义一个C结构并将其导入Swift(或者定义你自己的编组函数),你可能更加安全。 – 2014-12-04 22:02:51