Uważam, że Swift
i NSData
są bezbożnymi małżeństwami frustracji. Wydaje mi się, że czuję się tak, jak wszystkie nowe, znalezione bezpieczeństwo Swift wychodzi za każdym razem, gdy mam do czynienia z tym problemem. Ilość awarii (z nieprzydatnymi śladami) nie pomaga.Pobieranie danych z NSData za pomocą Swift
Więc nauczyłem się, że mogę uniknąć strasznego UnsafeMutablePointer
rzeczy robiąc rzeczy, jak następuje:
var bytes = [UInt8](count: 15, repeatedValue: 0)
anNSData.getBytes(&bytes, length=15)
odkryłem także, że można wyodrębnić bezpośrednio do wartości pojedynczej:
var u32:UInt32 = 0
anNSData.getBytes(&u32, length=4)
To prowadzi do dwóch pytań pośrednich:
1) Czy jest coś, co mogę użyć, to jest bardziej wiarygodne niż stałe kody tam. Gdyby to był C, po prostu użyłbym sizeof
. Ale myślę, że przeczytałem, że może powinienem używać strideof
zamiast sizeof
? A to nie zadziałałoby na [UInt8]
, prawda?
2) Dokumenty (dla Swift) mówią, że ten parametr ma być _ buffer: UnsafeMutablePointer<Void>
. Jak to działa? Czy po prostu mam szczęście? Dlaczego miałbym to robić zamiast bardziej natywnego/zarządzanego [Uint8] konstruktu? Zastanawiałem się, czy UnsafeMutablePointer
był protokołem, ale jest to struktura.
Ośmielony odczytaniem wartości bezpośrednio (a nie jako Tablica), pomyślałem, że mógłbym spróbować innego rodzaju struktury. Mam struct 6 bajtów, który wygląda tak:
struct TreeDescription : Hashable {
var id:UInt32 = 0x00000000
var channel:UInt8 = 0x00
var rssi:UInt8 = 0x00
var hashValue:Int {
return Int(self.id)
}
}
które faktycznie działa (po myśląc, że nie, ale w końcu robi to czysty co czyniło pewne awarie odejść)!
var tree = TreeDescription()
anNSData.getBytes(&newTree, length: 6)
Ale to prowadzi mnie do obaw o strukturę szczegółów opakowania? Dlaczego to działa? O co powinienem się martwić?
To wszystko wydaje mi się bardzo C-owskie. Myślałem, że Swift zabrał C z ObjectiveC.
może muszę spojrzeć na to. Ale to naprawdę nie pomaga mi zrozumieć, dlaczego inne konstrukcje (w szyku lub nie) również działają dobrze. –
@TravisGriggs Zaktualizowano moją odpowiedź, sprawdź to. – Kametrixom
Miło. Myślę, że prawie już tam jestem. Nadal nie wiadomo, dlaczego [UInt8] może zostać umieszczony bezpośrednio w miejscu, w którym porusza się UnsafeMutablePointer? Czy to jest charakter operatora inout (&)? Zauważyłem, że mogę użyć odwrotności powyższej techniki do skonstruowania 'NSData'. Na przykład. 'NSData (& myStruct, sizeof (myStruct))' i działa dobrze. Moja naiwna obserwacja jest taka, że zmienna & beforeVariable jest podobna do tej w C. –