Drucken Sie schnell ohne Zeilenumbruch

109

print()Fügt in Swift 2.0 automatisch ein Zeilenumbruchzeichen hinzu. In Swift 1.2 println()und print()früher getrennte Funktionen. Wie drucke ich also Text und füge keine neue Zeile hinzu, da swift keine Druckfunktion mehr hat, die keine neuen Zeilen anfügt.

Ankit Goel
quelle
3
@ DánielNagy Es ist kein Duplikat, da Swift 2.0 keine Druckfunktion hat. Ich frage nicht, wie auf der Konsole gedruckt werden soll, da die Druckfunktion dies erledigt. Ich frage "Wie man auf der Konsole druckt, ohne dass die neue Zeile an den eingegebenen Text angehängt wird"
Ankit Goel
2
Dies ist ausdrücklich in den Beta- Versionshinweisen zu
Martin R

Antworten:

207

Ab Swift 2.0 wird empfohlen, ohne Zeilenumbruch zu drucken:

print("Hello", terminator:"")
Cheniel
quelle
Auch wenn Sie nur die Schnittstelle mit dem seperatorParameter sehen. Sie können es einfach ignorieren, da es einen Standardwert hatfunc print(items: Any..., separator: String = default, terminator: String = default)
Binarian
2
Wo in den Swift-Dokumenten würde jemand herausfinden, was defaultgleich ist?
7stud
1
@ 7stud defaultist ein Platzhalter für einen Standardwert. Im Idealfall sollte die Dokumentation den tatsächlichen Wert enthalten, keinen Platzhalter.
Sulthan
1
Standardwerte sind: Trennzeichen "" (einzelnes Leerzeichen) und Abschlusszeichen \ n (neue Zeile)
Selva
66

printDie 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"
Sandeep
quelle
Funktioniert auch nicht für mich in Xcode 7beta4. Aufruf print("foo", appendNewLine: false)kompiliert aber die Ausgabe ist (foo), falseund eine neue Zeile wird trotzdem angehängt!
mluisbrown
@mluisbrown es ist appendNewline(Kleinbuchstaben l)
JeremyP
11

In Swift 2.0 können Sie dies tun:

Basisversion

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

Terminator verwenden

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

Trennzeichen verwenden

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

Trennzeichen und Abschlusszeichen verwenden

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

Verwenden einer Variablen

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

Verwenden von zwei Variablen

var hello = "Hello"
var world = "World"
print (hello, world)
result "Hello World\n"
Morten Gustafsson
quelle
Standardmäßig ist das Trennzeichen ein Leerzeichen" "
Jayram Kumar
4

Wenn Sie dieselbe Zeile in einer Schleife möchten:

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

Ausgabe: 1 2 3 4

PVCS
quelle