Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将结构(包括字节数组)与SWIFT-Struct-to-NSData和NSData-to-Struct一起使用_Swift_Struct_Byte_Bytearray_Nsdata - Fatal编程技术网

将结构(包括字节数组)与SWIFT-Struct-to-NSData和NSData-to-Struct一起使用

将结构(包括字节数组)与SWIFT-Struct-to-NSData和NSData-to-Struct一起使用,swift,struct,byte,bytearray,nsdata,Swift,Struct,Byte,Bytearray,Nsdata,继续我原来的职务: 我现在发现,如果我有一个包含字节的结构和一个字节数组,它就不能正确打包 示例代码: struct exampleStruct { var ModelNumber: Byte var MajorVersion: Byte var MinorVersion: Byte var Revision: Byte var Message: [Byte] } var myStruct = exampleStruct ( ModelNumbe

继续我原来的职务:

我现在发现,如果我有一个包含字节的结构和一个字节数组,它就不能正确打包

示例代码:

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)
)
我得到了以下意想不到的结果: “数据:”。我在等“数据”:

这似乎是因为没有设置[Byte]数组长度。可以用SWIFT设置吗?当我尝试以下方法时:

struct exampleStruct {
   var ModelNumber: Byte
   var MajorVersion: Byte
   var MinorVersion: Byte
   var Revision: Byte
   var Message: Byte[5] // << Set array length 5
}
struct示例struct{
var模型编号:字节
变量主版本:字节
var MinorVersion:字节
变量修订:字节

变量消息:字节[5]/
var消息:[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 ...
}
结构数组:MutableCollectionType,可切片{ ///此数组存储的元素类型` typealias元素=T ///始终为零,这是非空时第一个元素的索引。 var startIndex:Int{get} ///一种“超过末尾”的元素索引;最后一个有效索引的后继索引 ///下标参数。 var endIndex:Int{get} 下标(索引:Int)->T //……还有更多。。。 }
所以这不仅仅是一个字节的“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>
struct示例struct{
var模型编号:字节
变量主版本:字节
var MinorVersion:字节
变量修订:字节
var消息:(字节,字节,字节,字节,字节)
}
var myStruct=examplestuct(
型号:1,
主要版本:2,
结论:3,
修订:4,
消息:(0x48、0x45、0x4C、0x4C、0x4F)//您好
)
var数据=NSData(
字节:&myStruct,
长度:sizeof(示例结构)
)
println(数据)//
然而,我不认为Swift对二进制表示做出任何保证
这是一个Swift结构数组,而不是C数组。这太棒了-谢谢!出于某种原因,我一直认为Swift与C比实际更相似。@Mavro:不客气。–如果您需要一个定义良好的表示形式(例如用于数据交换)然后,通过定义C结构并将其导入Swift(或定义自己的封送处理函数),您可能更安全。