Dans Swift 2.0, print()
ajoute automatiquement un caractère de nouvelle ligne. Dans Swift 1.2, println()
et print()
étaient des fonctions séparées. Alors, comment puis-je imprimer du texte sans y ajouter de nouvelle ligne car Swift ne dispose plus d'une fonction d'impression qui n'ajoute pas de nouvelle ligne.
À partir de Swift 2.0, la méthode recommandée pour imprimer sans nouvelle ligne est la suivante:
print("Hello", terminator:"")
La fonction print
a complètement changé depuis la dernière révision de Swift, elle semble maintenant beaucoup plus simple et il existe une variante de méthode pour imprimer sur une console standard.
La signature de la méthode pour imprimer ressemble à ceci,
public func print<Target>(_ items: Any..., separator: String = default, terminator: String = default, to output: inout Target) where Target : TextOutputStream
Et voici quelques cas d'utilisation,
print("Swift is awesome.")
print("Swift", "is", "awesome", separator:" ")
print("Swift", "is", "awesome", separator:" ", terminator:".")
Impressions:
Swift is awesome.
Swift is awesome
Swift is awesome.
concaténation
print("This is wild", terminator: " ")
print("world")
Impressions:
This is wild world
Donc, en utilisant terminator, vous devez faire attention à ce que le contenu soit pertinent pour la même ligne.
Objet d'impression avec CustomStringConvertible
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)
Impressions:
<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)
}
}
Maintenant, avec lldb, vous pouvez utiliser la commande po et cela affichera un objet comme ceci dans la console lldb,
<name: Jack, addresses: Helsinki,Tampere 0x60c000044860>
Connexion au fichier en utilisant 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)!)
}
}
Maintenant, en utilisant print pour diffuser,
print("First of all", to: &myStream )
print("Then after", to: &myStream)
print("And, finally", to: &myStream)
Imprimer dans le fichier:
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]])
}
}
Maintenant, dans le débogueur lldb, si vous utilisez la commande po,
> po person
Le résultat serait quelque chose comme ça,
▿ <name: Jack, addresses: Tampere Helsinki 0x7feb82f26e80>
- name : "Jack"
▿ address1 : Address
- city : "Helsinki"
▿ address2 : Address
- city : "Tampere"
Dans Swift 2.0, vous pouvez faire ceci:
version de base
print("Hello World")
result "Hello World\n"
tilisation du terminateur
print("Hello World", terminator:"")
result "Hello World"
en utilisant un séparateur
print("Hello", "World", separator:" ")
result "Hello World\n"
en utilisant séparateur et terminateur
print("Hello", "World", separator:" ", terminator:"")
result "Hello World"
tilisation d'une variable
var helloworld = "Hello World"
print(helloworld)
result "Hello World\n"
en utilisant deux variables
var hello = "Hello"
var world = "World"
print (hello, world)
result "Hello World\n"
Si vous voulez la même ligne en boucle:
for i in 1...4
{
print("", i, separator: " ", terminator:"")
}
print()
Sortie: 1 2 3 4