2014-12-04 16 views
6

Tôi đang cố gắng hiểu cách cấu trúc hoạt động trong SWIFT. Tôi quen thuộc với cách .NET xử lý chúng và làm thế nào nó gói byte thành một cấu trúc vvSử dụng Structs (Byte) với SWIFT - Struct to NSData và NSData đến Struct

Tôi đang tìm một số weirdness với đoạn mã sau:

struct exampleStruct { 
    var ModelNumber: Byte! 
    var MajorVersion: Byte! 
    var MinorVersion: Byte! 
    var Revision: Byte! 
} 


var myStruct = exampleStruct (
    ModelNumber: 1, 
    MajorVersion: 2, 
    MinorVersion: 3, 
    Revision: 4 
) 

myStruct.MinorVersion // << Returns 3 

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

println("data: \(data)") 

Lợi nhuận println: "dữ liệu: < 01.000.200 03.000.400>"

tôi đã chờ đợi dữ liệu để thực sự là: 'dữ liệu: < 01.020.304>'

Bất cứ ý tưởng tại sao SWIFT không đóng gói 1 byte như 1 byte, thay vào đó nó được đóng gói một byte là 2 byte (1 byte giá trị và 1 byte là 00)?

Ở bên flip nếu tôi làm như sau:

var newStruct = exampleStruct(ModelNumber: nil, MajorVersion: nil, MinorVersion: nil, Revision: nil) 

var sendBytes:[Byte] = [0x1, 0x2, 0x3, 0x4] 
var newData = NSData(bytes: sendBytes, length: sendBytes.count) 

newData.getBytes(
    &newStruct, 
    length: sizeof(exampleStruct) 
) 

newStruct.MinorVersion // << Returns nil 

println(newData) 

Các println (newData) là đúng và những gì tôi mong đợi về giá trị: < 01.020.304>

Tuy nhiên, khi tôi truy cập vào minorVersion nó trả về nil, không phải những gì tôi mong đợi là 3.

Có cách nào để buộc cấu trúc phải tôn trọng việc đóng gói một byte không?

Trả lời

2

Thay đổi Byte! thành Byte.

Nếu không, bạn đang tạo struct giữ Optional<Byte> đó là lớn hơn một byte bởi vì ngoài việc tổ chức một byte, nó cần thêm byte để chỉ ra nếu nó là nil

Lưu ý: Đây có thể vẫn không làm việc như bạn có thể cần một cái gì đó như __attribute__((packed)) để nói với trình biên dịch làm thế nào để đối phó với sự liên kết. AFAIK, nó không có sẵn trong Swift.

+0

Cảm ơn! Điều đó làm việc và cảm ơn cho việc làm rõ, nó có ý nghĩa. – Mavro