print
Die Funktion hat sich seit der späten Überarbeitung von Swift komplett geändert. Jetzt sieht sie viel einfacher aus und es gibt verschiedene Methoden zum Drucken auf der Standardkonsole.
Die Methodensignatur für den Druck sieht ungefähr so aus:
public func print<Target>(_ items: Any..., separator: String = default, terminator: String = default, to output: inout Target) where Target : TextOutputStream
Und hier sind einige Anwendungsfälle,
print("Swift is awesome.")
print("Swift", "is", "awesome", separator:" ")
print("Swift", "is", "awesome", separator:" ", terminator:".")
Drucke:
Swift is awesome.
Swift is awesome
Swift is awesome.
Verketten
print("This is wild", terminator: " ")
print("world")
Drucke:
This is wild world
Wenn Sie Terminator verwenden, sollten Sie daher darauf achten, dass der Inhalt für dieselbe Zeile relevant ist.
Objekt mit CustomStringConvertible drucken
struct Address {
let city: String
}
class Person {
let name = "Jack"
let addresses = [
Address(city: "Helsinki"),
Address(city: "Tampere")
]
}
extension Person: CustomStringConvertible {
var description: String {
let objectAddress = unsafeBitCast(self, to: Int.self)
return String(format: "<name: \(name) %p>", objectAddress)
}
}
let jack = Person()
print(jack)
Drucke:
<name: Jack 0x608000041c20>
CustomDebugStringConvertible
extension Person: CustomDebugStringConvertible {
var debugDescription: String {
let objectAddress = unsafeBitCast(self, to: Int.self)
let addressString = addresses.map { $0.city }.joined(separator: ",")
return String(format: "<name: \(name), addresses: \(addressString) %p>",objectAddress)
}
}
Mit lldb können Sie jetzt den Befehl po verwenden und das Objekt wird wie folgt in der lldb-Konsole gedruckt.
<name: Jack, addresses: Helsinki,Tampere 0x60c000044860>
Protokollierung in einer Datei mit TextOutputStream
struct MyStreamer: TextOutputStream {
lazy var fileHandle: FileHandle? = {
let fileHandle = FileHandle(forWritingAtPath: self.logPath)
return fileHandle
}()
var logPath: String = "My file path"
mutating func write(_ string: String) {
fileHandle?.seekToEndOfFile()
fileHandle?.write(string.data(using:.utf8)!)
}
}
Verwenden Sie jetzt print zum Streamen.
print("First of all", to: &myStream )
print("Then after", to: &myStream)
print("And, finally", to: &myStream)
Druckt in Datei:
First of all
Then after
And finally
CustomReflectable
extension Person: CustomReflectable {
var customMirror: Mirror {
return Mirror(self, children: ["name": name, "address1": addresses[0], "address2": addresses[1]])
}
}
Wenn Sie jetzt im lldb-Debugger den Befehl po verwenden,
> po person
Ergebnis wäre so etwas,
▿ <name: Jack, addresses: Tampere Helsinki 0x7feb82f26e80>
- name : "Jack"
▿ address1 : Address
- city : "Helsinki"
▿ address2 : Address
- city : "Tampere"