2014-06-12 24 views
7

Nie mogę znaleźć niczego w książce Swift o io. Czy istnieje ogólny protokół podobny do interfejsu OutputStream lub Go's Writer Java do pisania strumienia bajtów? Jeśli piszesz klasę, która zwraca strumień, czy musisz napisać własny protokół lub użyć protokołu Objective C?Czy szybki ma protokół do zapisywania strumienia bajtów?

Jasno, proszę o interfejs macierzysty Swift, nie dlatego, że unikam używania Celu C lub Kakao, ale po to, aby opisać oczekiwane zachowanie dla Swift do kodu Swift.

+1

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Streams/ Artykuły/CocoaStreamsOverview.html –

+0

Wydaje się dziwne, że nie masz czegoś tak podstawowego jak część standardowej biblioteki. NSStream naprawdę nie jest tak, jak byś to zrobił, gdybyś napisał go szybko. – sanz

+0

Zgadzam się, że Swift w tej chwili brakuje w tym obszarze, ale został zaprojektowany do pracy z ramami Cocoa. czy jest coś konkretnego, co próbujesz zrobić? –

Odpowiedz

12

To jest coś, o czym doktorzy Swift są spokojni i chciałem wiedzieć więcej o tym, więc zajrzałem do tego.

Jest to protokół, który nazywa Streamable:

protocol Streamable { 
    func writeTo<Target : OutputStream>(inout target: Target) 
} 

OutputStream:

protocol OutputStream { 
    func write(string: String) 
} 

write pozwala obiekt do zapisania.

String zgodny zarówno, dzięki czemu łatwo napisać do iz:

var target = String() 
"this is a message".writeTo(&target) 
println(target) 
// this is a message 

Zapis do pliku:

var msg = "this will be written to an output file" 
msg.writeToFile("output.txt", atomically: false, encoding: NSUTF8StringEncoding, error: nil) 
// creates 'output.txt' in the same folder as the executable 

Istnieje również writeToUrl.

zakładam wszystkie te funkcje są wbudowane w górnej części kakao strumieni, które mają podobną funkcjonalność:

var os = NSOutputStream(toFileAtPath: "output.txt", append: true) 
os.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode) 

var msg = "a truly remarkable message" 
var ptr:CConstPointer<UInt8> = msg.nulTerminatedUTF8 

os.open() 
os.write(ptr, maxLength: msg.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)) 
os.close() 
+0

Miłe znalezisko. Wygląda na to, że nadal działają, co dodaje otuchy. – sanz