Schreiben von Daten in einen NSOutputStream in Swift 3

8

Die Lösung von diese Frage funktioniert nicht mehr mit Schnell 3.

Es gibt keine Eigenschaft bytes von Data (früher NSData .

%Vor%

Mit diesem Code erhalte ich den Fehler:

%Vor%

Wie kannst du in swift 3 Data in NSOutputStream schreiben?

    
ahyattdev 29.06.2016, 04:20
quelle

4 Antworten

10

NSData hatte eine bytes -Eigenschaft, um auf die Bytes zuzugreifen. Der neue Werttyp Data in Swift 3 hat withUnsafeBytes() Methode stattdessen, die eine Schließung mit einem Zeiger auf die Bytes aufruft.

So schreibst du Data in ein NSOutputStream (ohne Casting auf NSData ):

%Vor%

Anmerkungen:   withUnsafeBytes() ist eine generische Methode:

%Vor%

In dem obigen Aufruf, Sowohl ContentType als auch ResultType werden automatisch durch abgeleitet der Compiler (als UInt8 und Int ), macht zusätzliche UnsafePointer() Conversions sind nicht erforderlich.

outputStream.write() gibt die Anzahl der tatsächlich geschriebenen Bytes zurück. Im Allgemeinen sollten Sie diesen Wert überprüfen . Es kann -1 if sein Die Schreiboperation ist fehlgeschlagen oder kleiner als data.count beim Schreiben zu Sockets, Pipes oder anderen Objekten mit einer Flusskontrolle.

    
Martin R 29.06.2016, 06:53
quelle
3

Martin R , danke für Ihre Antwort. Das war die Grundlage für eine Komplettlösung. Hier ist es:

%Vor%     
Sergey Markelov 19.09.2016 18:34
quelle
2

Benutze einfach diese Erweiterung (Swift 4)

%Vor%

Und für InputStream

%Vor%     
Dmitry Kozlov 19.09.2017 13:31
quelle
0

Data und NSData sind zwei separate Klassen in Swift 3, und Data hat nicht die Eigenschaft bytes .

Die Lösung besteht darin, data vom Typ NSData

zu definieren %Vor%

Nach Migrieren zu Swift 2.3 oder Swift 3 von Swift 2.2 :

  

Der Migrator konvertiert die meisten Verwendungen von NSData in den neuen Werttyp Data. Es gibt jedoch bestimmte Methoden für NSData, die mit UnsafeMutablePointer arbeiten, während die entsprechenden Methoden für Daten UnsafeMutablePointer verwenden. (Zum Beispiel akzeptiert NSData.getBytes (: length :) mehr als Data.copyBytes (: length :).) Zur Erinnerung: Das speicherinterne Layout von Swift-Typen ist nicht garantiert.

    
ahyattdev 29.06.2016 04:28
quelle