imprimir sin nueva línea en rápido

110

En swift 2.0, print()agrega automáticamente un carácter de nueva línea. En swift 1.2, println()y print()solía ser funciones separadas. Entonces, ¿cómo imprimo algo de texto y no le agrego una nueva línea, ya que Swift ya no tiene una función de impresión que no agrega nuevas líneas?

Ankit Goel
fuente
3
@ DánielNagy No es un duplicado porque swift 2.0 no tiene función println. No estoy preguntando cómo imprimir en la consola porque la función de impresión lo hará. Estoy preguntando "Cómo imprimir en la consola sin la nueva línea adjunta al texto de entrada"
Ankit Goel
2
Esto se documenta explícitamente en las notas de la versión beta de Xcode 7: "println e print se han fusionado en una sola función de impresión con un argumento predeterminado ..."
Martin R

Respuestas:

208

A partir de Swift 2.0, el método recomendado para imprimir sin nueva línea es:

print("Hello", terminator:"")
cheniel
fuente
Aunque solo vea la interfaz con el seperatorparámetro. Simplemente puede ignorarlo porque tiene un valor predeterminadofunc print(items: Any..., separator: String = default, terminator: String = default)
Binarian
2
¿En qué parte de los documentos de Swift descubriría alguien a qué defaultequivale?
7stud
1
@ 7stud defaultes un marcador de posición para un valor predeterminado. Idealmente, la documentación debería contener el valor real, no un marcador de posición.
Sulthan
1
Los valores predeterminados son: separador "" (espacio simple) y terminador \ n (nueva línea)
selva
68

printLa función ha cambiado completamente desde la última revisión de Swift , ahora parece mucho más simple y hay una variante de método para imprimir en la consola estándar.

La firma del método para imprimir se parece a esto,

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

Y aquí hay algunos casos de uso,

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

Huellas dactilares:

Swift is awesome.
Swift is awesome
Swift is awesome.

Concatenando

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

Huellas dactilares:

This is wild world

Por lo tanto, al usar Terminator, debe tener cuidado de que el contenido sea relevante para la misma línea.

Impresión de objeto 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)

Huellas dactilares:

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

Ahora, con lldb , puede usar comando po e imprimirá el objeto como este en la consola lldb,

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

Registro en archivo usando 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)!)
  }
}

Ahora, usando imprimir para transmitir,

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

Imprime para archivo:

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

Ahora, en el depurador lldb, si usa el comando po,

> po person

El resultado sería algo como esto,

<name: Jack, addresses: Tampere Helsinki  0x7feb82f26e80>
  - name : "Jack"
  ▿ address1 : Address
    - city : "Helsinki"
  ▿ address2 : Address
    - city : "Tampere"
Sandeep
fuente
Tampoco me funciona en Xcode 7beta4. ¡La llamada se print("foo", appendNewLine: false)compila pero la salida es (foo), falsey se agrega una nueva línea de todos modos!
mluisbrown
@mluisbrown es appendNewline(minúscula l)
JeremyP
11

En Swift 2.0 puedes hacer esto:

Versión básica

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

Usando terminador

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

Usando separador

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

Usando separador y terminador

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

Usando una variable

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

Usando dos variables

var hello = "Hello"
var world = "World"
print (hello, world)
result "Hello World\n"
Morten Gustafsson
fuente
Por defecto, el separador es un espacio" "
Jayram Kumar
4

Si quieres la misma línea en bucle:

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

Salida: 1 2 3 4

PVCS
fuente