2016-06-29 16 views
12

Tôi đã cố gắng để chạy mã dưới đây vào nhanh chóng 3Swift 3 thay đổi cho phương pháp getBytes

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

nơi dữ liệu là 'dữ liệu' datatype (NSData là thay đổi để 'dữ liệu' theo nhanh chóng 3 hướng dẫn)

Tôi không thể chạy mã trên trong Swift 3. Trình biên dịch cho biết lỗi "Giá trị lặp lại đối số phải đứng trước đối số". Cùng một dòng mã đã hoạt động trong Swift 2.2

Giải pháp là gì?

+0

Mặc dù câu hỏi khác nhau một chút câu trả lời phải giống nhau: http://stackoverflow.com/questions/38090320/writing-data-to-an-nsoutputstream-in-swift-3 – Desdenova

Trả lời

15

Nó có nghĩa là các đối số đặt hàng đã bị đảo ngược trong Swift 3.

Đối với NSData:

var values = [UInt8](repeating:0, count:data!.length) 
data.getBytes(&values, length: data!.length) 

Đối với Dữ liệu:

var values = [UInt8](repeating:0, count:data!.count) 
data.copyBytes(to: &values, count: data!.count) 
+1

Điều này là dành cho một phiên bản đầu tiên của Swift 3. Đối với Swift 3 hiện tại và cho Swift 4, bạn nên sử dụng câu trả lời của @ svd. – Moritz

26

sau Đối với Swift3 chỉ cần sử dụng:

let array = [UInt8](yourDataObject) 

Đó ' Tất cả, folks!)

+0

Bạn sử dụng cái này như thế nào? Tôi đang cố gắng để chuyển đổi sau từ Objective-C: int16_t \t giá trị \t = 0; CGFloat result = NAN; nếu (tempCharacteristic) { [[tempCharacteristic value] getBytes: & value length: sizeof (value)]; kết quả = (CGFloat) giá trị/10,0f; } // tempCharacteristic là một CBCharacteristic – Surz

+0

Tôi sợ nhưng để đạt được kết quả mong muốn, bạn cần phải thực hiện một số bước. Thật không may tôi không có nhiều kinh nghiệm với CB nhưng như tôi thấy bạn cần giá trị Int16 và hơn chia nó để có được Float. Từ quan điểm của tôi, bạn có thể đạt được điều này bằng cách làm theo: cho phép byte = [UInt8] (tempCharacteristic.value); cho phép con trỏ = UnsafePointer (byte); cho fPointer = pointer.withMemoryRebound (tới: Int16.self, dung lượng: 2) { trả lại $ 0 }; để giá trị = Int16 (fPointer.pointee); Hy vọng điều này sẽ hữu ích. (Tất nhiên loại bỏ tất cả dấu chấm phẩy;)) – sVd

+0

Cảm ơn rất nhiều cho con trỏ của bạn, @sVd. Tôi vẫn gặp sự cố khi chuyển đổi đoạn mã - bạn có muốn kiểm tra câu hỏi của mình không? https://stackoverflow.com/questions/45287488/trouble-converting-nsdata-objective-c-code-to-swift – Surz

Các vấn đề liên quan