2016-09-15 32 views
12

Tôi đã đoạn mã sau viết bằng Swift 2.2:Làm thế nào để sử dụng UnsafeMutablePointer trong Swift 3?

let keyData = NSMutableData(length: 64)! 
SecRandomCopyBytes(kSecRandomDefault, 64, UnsafeMutablePointer<UInt8>(keyData.mutableBytes)) 

XCode 8 điểm nổi bật mà dòng thứ hai và tuyên bố rằng

Không thể gọi initializer cho loại 'UnsafeMutablePointer < _>' với một danh sách luận loại '(UnsafeMutableRawPointer)'

Mặc dù tôi đánh giá cao XCode cho tôi biết điều này, tôi không hiểu cách thay đổi UnsafeMutabl eRawPointer được chấp nhận.

Có ai biết cách chuyển mã này sang Swift 3 không?

+0

Tôi cũng gặp sự cố này. Bạn đã tìm thấy giải pháp nào chưa? –

+0

Để tránh trùng lặp, đây là câu hỏi của tôi, rất giống với câu hỏi của bạn. Hy vọng ai đó có thể trả lời câu hỏi của tôi cùng với bạn. 'Không thể gọi initializer cho loại 'UnsafePointer <_>' với một danh sách đối số của loại '(UnsafeMutableRawPointer?)'' –

+0

Khác với câu trả lời của OOper, không. Bạn có phải sử dụng NSMutableData trong trường hợp của bạn? – AppreciateIt

Trả lời

16

tôi khuyên bạn nên làm việc với Data hơn NSData trong Swift 3.

var keyData = Data(count: 64) 
let result = keyData.withUnsafeMutableBytes {mutableBytes in 
    SecRandomCopyBytes(kSecRandomDefault, keyData.count, mutableBytes) 
} 

withUnsafeMutableBytes(_:) được khai báo là một phương pháp chung chung, vì vậy, trong những trường hợp đơn giản như thế này, bạn có thể sử dụng nó mà không chỉ định loại nguyên tố .

+0

vui lòng xem https://stackoverflow.com/questions/45181614/cannot-invoke-initializer-for-type-unsafepointer-with-an-argument-list-of-typ này –

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