2016-08-16 33 views
8

kod, który został uprzednio pracujących w Swift 2.2 jest teraz rzuca się następujący błąd w Swift 3:'bajty' jest niedostępna: Użycie withUnsafeBytes zamiast

enter image description here

Oto mój kod:

let tempData: NSMutableData = NSMutableData(length: 26)! 
tempData.replaceBytes(in: NSMakeRange(0, data.count), withBytes:data.bytes) 

Co należy zastąpić "data.bytes", aby naprawić błąd? Próbowałem implementacji "withUnsafeBytes" i przejrzałem dokumentację Apple, ale nie mogę się z tym pogodzić!

+0

Nie podałeś źródła 'danych', ale jeśli możesz przekonwertować to również na' Dane', to wszystko będzie znacznie prostsze i nie będziesz musiał mostkować pomiędzy 'NSMutableData' i' Data'. Po prostu użyjesz 'replaceSubrange'. –

Odpowiedz

9

Zakładając, że data ma typ Data następujące powinny działać:

let tempData: NSMutableData = NSMutableData(length: 26)! 
data.withUnsafeBytes { 
    tempData.replaceBytes(in: NSMakeRange(0, data.count), withBytes: $0) 
} 

metodą Data

/// Access the bytes in the data. 
/// 
/// - warning: The byte pointer argument should not be stored and used outside of the lifetime of the call to the closure. 
public func withUnsafeBytes<ResultType, ContentType>(_ body: @noescape (UnsafePointer<ContentType>) throws -> ResultType) rethrows -> ResultType 

. Wewnątrz zamknięcia $0 jest UnsafePointer<Void> do bajtów (UnsafeRawPointer w Xcode 8 beta 6).

+0

czy możesz zaktualizować odpowiedź na swift 3.0 –

+0

@TejasArdeshna: To * jest * Swift 3. –

+0

dlaczego długość jest zakodowana na stałe jako 26? czy spowoduje to problem z dużymi danymi? Jestem nowy w ios, tylko potwierdzam. –