2014-07-11 26 views
5

Tôi đang trên beta 3. Hãy xem xét các dòng Objective-C sau:Swift - chuyển đổi từ ConstUnsafePointer <()>

const uint8_t *reportData = [data bytes]; 

nơi data là một đối tượng NSData.

Dòng này sẽ được viết lại bằng Swift như thế nào?

data.bytes thuộc loại ConstUnsafePointer<()> và trong khi có nhiều tài liệu về cách tạo loại con trỏ trong Swift, không có nhiều thông tin về cách làm việc với chúng.

chỉnh sửa: Để thêm một số ngữ cảnh, tôi đang cố gắng chuyển mã mẫu HeartRateMonitor của Apple sang Swift. Mã này tương tác với các màn hình nhịp tim BLE. Mã này tôi đang làm việc trên dịch các dữ liệu nhận được bởi hệ thống Bluetooth vào một int để sử dụng trong giao diện người dùng. Dữ liệu nhận được từ BT được mong đợi là một mảng uints, phần tử 0 được sử dụng để kiểm tra cờ và phần tử 1 chứa giá trị.

Đây là dòng Objective-C tương tự trong bối cảnh:

const uint8_t *reportData = [data bytes]; 
uint16_t bpm = 0; 

if ((reportData[0] & 0x01) == 0) 
{ 
    /* uint8 bpm */ 
    bpm = reportData[1]; 
} 
+1

nó là gì bạn muốn làm gì với nó? Bạn đang làm gì trong Objective-C? Bạn đã thử làm điều tương tự chưa? Kinh nghiệm của tôi là mọi thứ cứ tiếp tục hoạt động. Ví dụ: "byte" riêng lẻ có thể truy cập được bằng cách sử dụng subscripting. – matt

+0

đã thêm một số ghi chú khác trong câu hỏi gốc với ngữ cảnh –

+1

Và bạn đã thử dịch trực tiếp? Như tôi đã nói trước đây, kinh nghiệm của tôi là việc subscripting sẽ hoạt động giống như bạn mong đợi. – matt

Trả lời

6

Điều bạn đang tìm kiếm là cách chuyển đổi NSData thành một mảng UInt8. Đây là cách làm.

import Foundation 
let path = "/etc/csh.cshrc" // something existent 
let data = NSData(contentsOfFile: path) 

var aofb = [UInt8](count:data.length, repeatedValue:0) 
data.getBytes(&aofb, length:data.length) 

for c in aofb { 
    let s = UnicodeScalar(Int(c)).escape(asASCII:true) 
    println("\(c):\(s)") 
} 
+0

Chỉ cần thêm một số bối cảnh cho câu hỏi của tôi - đối tượng NSData nhận được thực sự đại diện cho một mảng uints, vì vậy cố gắng chuyển đổi thành chuỗi sẽ không hoạt động. –

+1

Ví dụ mới cho thấy cách chuyển đổi NSData thành một mảng UInt8. – dankogai

1

Chỉ cần xây dựng theo mã (Lưu ý mã dưới đây hoạt động trên Beta 3, ConstUnsafePointer <()> cần phải được thay đổi để COpaquePointer để làm việc trên Beta 2, vui lòng xem lịch sử chỉnh sửa để biết thêm thông tin)

var dataPath = NSBundle.mainBundle().pathForResource("TestData", ofType: "") // What I have in TestData is "GREETINGS WORLD" 
var originalData = NSData(contentsOfFile: dataPath) 
var dataLength = originalData.length 
println("original data: \(originalData)") // Output original data 

// Data to bytes 
var reportBytes: ConstUnsafePointer<()> = originalData.bytes 
var bytesToString = NSString(bytes: reportBytes, length: dataLength, encoding: NSUTF8StringEncoding) 
println("string from bytes: \(bytesToString)") 

// Bytes to data 
var bytesToData = NSData(bytes: reportBytes, length: dataLength) 
println("data from bytes: \(bytesToData)") 

điều khiển đăng nhập

original data: <47524545 54494e47 5320574f 524c44> 
string from bytes: GREETINGS WORLD 
data from bytes: <47524545 54494e47 5320574f 524c44> 

Cũng thấy điều này có thể giúp

ConstUnsafePointer<T> 

/// This type stores a pointer to an object of type T. It provides no 
/// automated memory management, and therefore the user must take care 
/// to allocate and free memory appropriately. 

Hope ánh sáng nhà kho này.

+0

Chỉ cần thêm một số ngữ cảnh nữa vào câu hỏi của tôi - đối tượng NSData nhận được thực sự đại diện cho một mảng uints, vì vậy cố gắng chuyển đổi thành chuỗi sẽ không hoạt động. –

1

Nhìn vào xử lý theo dõi nhịp tim bluetooth trong Swift bây giờ tôi tìm thấy cách đơn giản nhất để có được các giá trị byte NSData sang định dạng uint8:

let bytes = UnsafePointer<UInt8>(data.bytes) 

if bytes[0] & 0x01 == 0 { 
    NSLog("BPM \(bytes[1]") 
} 
Các vấn đề liên quan