stampa senza ritorno a capo in modo rapido


110

In swift 2.0, print()aggiunge automaticamente un carattere di nuova riga. In swift 1.2, println()e prima print()erano funzioni separate. Quindi come faccio a stampare del testo e non aggiungervi una nuova riga poiché swift non ha più una funzione di stampa che non aggiunge nuove righe.



3
@ DánielNagy Non è un duplicato perché swift 2.0 non ha una funzione println. Non sto chiedendo come stampare su console perché la funzione di stampa lo farà. Chiedo "Come stampare su console senza l'aggiunta di una nuova riga al testo di input"
Ankit Goel,

2
Questo è esplicitamente documentato nelle note di rilascio beta di Xcode 7: "println e print sono stati fusi insieme in una singola funzione di stampa con un argomento predefinito ..."
Martin R

Risposte:


208

A partire da Swift 2.0, il metodo di stampa consigliato senza nuova riga è:

print("Hello", terminator:"")

Anche se vedi solo l'interfaccia con il seperatorparametro. Puoi semplicemente ignorarlo perché ha un valore predefinitofunc print(items: Any..., separator: String = default, terminator: String = default)
Binarian

2
Dove nei documenti Swift qualcuno potrebbe scoprire cosa defaultè uguale a?
7stud

1
@ 7stud defaultè un segnaposto per un valore predefinito. Idealmente, la documentazione dovrebbe contenere il valore effettivo, non un segnaposto.
Sulthan

1
I valori predefiniti sono: separatore "" (spazio singolo) e terminatore \ n (nuova riga)
selva

68

printla funzione è cambiata completamente dall'ultima revisione di Swift , ora sembra molto più semplice e ci sono varianti del metodo per stampare su console standard.

La firma del metodo per la stampa è simile a questa,

public func print<Target>(_ items: Any..., separator: String = default, terminator: String = default, to output: inout Target) where Target : TextOutputStream

E qui ci sono alcuni casi d'uso,

print("Swift is awesome.")
print("Swift", "is", "awesome", separator:" ")
print("Swift", "is", "awesome", separator:" ", terminator:".")

stampe:

Swift is awesome.
Swift is awesome
Swift is awesome.

concatenando

print("This is wild", terminator: " ")
print("world")

stampe:

This is wild world

Quindi, usando il terminatore, dovresti stare attento che i contenuti siano rilevanti per la stessa riga.

Oggetto di stampa con 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)

stampe:

<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)
  }
}

Ora, con lldb , puoi usare il comando po e stamperà l'oggetto come questo nella console lldb,

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

Registrazione su file utilizzando 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)!)
  }
}

Ora, usando la stampa per lo streaming,

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

Stampe su file:

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]])
  }
}

Ora, nel debugger lldb, se usi il comando po,

> po person

Il risultato sarebbe qualcosa di simile,

<name: Jack, addresses: Tampere Helsinki  0x7feb82f26e80>
  - name : "Jack"
  ▿ address1 : Address
    - city : "Helsinki"
  ▿ address2 : Address
    - city : "Tampere"

Inoltre non funziona per me in Xcode 7beta4. La chiamata print("foo", appendNewLine: false)compila ma l'output è (foo), falsee una nuova riga viene comunque aggiunta!
mluisbrown

@mluisbrown è appendNewline(minuscolo l)
JeremyP

11

In Swift 2.0 puoi fare questo:

Versione base

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

Utilizzo del terminatore

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

Utilizzando separatore

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

Utilizzo di separatore e terminatore

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

Utilizzando una variabile

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

Utilizzando due variabili

var hello = "Hello"
var world = "World"
print (hello, world)
result "Hello World\n"

Per impostazione predefinita, il separatore è uno spazio" "
Jayram Kumar

4

Se vuoi la stessa linea in loop:

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

Uscita: 1 2 3 4

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.