imprimer sans nouvelle ligne en swift

110

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 et ne pas y ajouter de nouvelle ligne puisque swift n'a plus de fonction d'impression qui n'ajoute pas de nouvelles lignes.

Ankit Goel
la source
3
@ DánielNagy Ce n'est pas un doublon car swift 2.0 n'a pas de fonction println. Je ne demande pas comment imprimer sur la console car la fonction d'impression le fera. Je demande "Comment imprimer sur la console sans ajouter la nouvelle ligne au texte d'entrée"
Ankit Goel
2
Ceci est explicitement documenté dans les notes de version bêta de Xcode 7: "println et print ont été fusionnés en une seule fonction d'impression avec un argument par défaut ..."
Martin R

Réponses:

208

À partir de Swift 2.0, la méthode d'impression recommandée sans nouvelle ligne est:

print("Hello", terminator:"")
Cheniel
la source
Même si vous ne voyez que l'interface avec le seperatorparamètre. Vous pouvez simplement l'ignorer car il a une valeur par défautfunc print(items: Any..., separator: String = default, terminator: String = default)
Binarian
2
À quel endroit dans la documentation Swift quelqu'un trouverait-il ce qui defaultest égal à?
7stud
1
@ 7stud defaultest un espace réservé pour une valeur par défaut. Idéalement, la documentation doit contenir la valeur réelle et non un espace réservé.
Sulthan
1
Les valeurs par défaut sont: séparateur "" (espace unique) et terminateur \ n (nouvelle ligne)
selva
68

printLa fonction 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 la console standard.

La signature de méthode pour l'impression 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

Ainsi, en utilisant le terminateur, vous devez faire attention à ce que le contenu soit pertinent pour la même ligne.

Impression d'un objet 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 il affichera l'objet comme ceci dans la console lldb,

<name: Jack, addresses: Helsinki,Tampere 0x60c000044860>

Journalisation dans un fichier à l'aide de 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 l'impression pour diffuser,

print("First of all", to: &myStream )
print("Then after", to: &myStream)
print("And, finally", to: &myStream)

Imprime au fichier:

First of all
Then after
And finally

PersonnaliséRéflectable

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"
Sandeep
la source
Ne fonctionne pas non plus pour moi dans Xcode 7beta4. L'appel print("foo", appendNewLine: false)compile mais la sortie est (foo), falseet une nouvelle ligne est ajoutée de toute façon!
mluisbrown
@mluisbrown c'est appendNewline(minuscule l)
JeremyP
11

Dans Swift 2.0, vous pouvez faire ceci:

Version de base

print("Hello World")
result "Hello World\n"

Utilisation du terminateur

print("Hello World", terminator:"")
result "Hello World"

Utilisation du séparateur

print("Hello", "World", separator:" ")
result "Hello World\n"

Utilisation du séparateur et du terminateur

print("Hello", "World", separator:" ", terminator:"")
result "Hello World"

Utiliser une variable

var helloworld = "Hello World"
print(helloworld)
result "Hello World\n"

Utilisation de deux variables

var hello = "Hello"
var world = "World"
print (hello, world)
result "Hello World\n"
Morten Gustafsson
la source
Par défaut, le séparateur est un espace" "
Jayram Kumar
4

Si vous voulez la même ligne en boucle:

for i in 1...4
{
    print("", i, separator: " ", terminator:"")
}
print()

Sortie: 1 2 3 4

PVCS
la source