imprimir sem nova linha em rápido

110

No swift 2.0, print()adiciona automaticamente um caractere de nova linha. No Swift 1.2 println()e print()costumava ser funções separadas. Então, como faço para imprimir algum texto e não adicionar uma nova linha a ele, já que o swift não tem mais uma função de impressão que não acrescenta novas linhas.

Ankit Goel
fonte
possível duplicata de Como imprimir em um console usando o Swift Playground?
Dániel Nagy de
3
@ DánielNagy Não é uma duplicata porque o swift 2.0 não tem uma função println. Não estou perguntando como imprimir para o console porque a função de impressão fará isso. Estou perguntando "Como imprimir para o console sem a nova linha anexada ao texto de entrada"
Ankit Goel
2
Isso está explicitamente documentado nas notas de versão beta do Xcode 7: "println e print foram mesclados em uma única função de impressão com um argumento padrão ..."
Martin R

Respostas:

208

A partir do Swift 2.0, o método recomendado de impressão sem nova linha é:

print("Hello", terminator:"")
Cheniel
fonte
Mesmo que você só veja a interface com o seperatorparâmetro. Você pode simplesmente ignorá-lo porque tem um valor padrãofunc print(items: Any..., separator: String = default, terminator: String = default)
Binarian 01 de
2
Onde nos documentos do Swift alguém descobriria o que defaulté igual a?
7 de
1
@ 7stud defaulté um espaço reservado para um valor padrão. Idealmente, a documentação deve conter o valor real, não um espaço reservado.
Sulthan
1
Os valores padrão são: separador "" (espaço único) e terminador \ n (nova linha)
selva
68

printA função mudou completamente desde a última revisão do Swift , agora parece muito mais simples e há variantes de método para imprimir no console padrão.

A assinatura do método para imprimir se parece com isto,

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

E aqui estão alguns casos de uso,

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

Impressões:

Swift is awesome.
Swift is awesome
Swift is awesome.

Concatenando

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

Impressões:

This is wild world

Portanto, usando o terminator, você deve ter cuidado para que o conteúdo seja relevante para a mesma linha.

Imprimindo objeto com 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)

Impressões:

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

Agora, com o lldb , você pode usar o comando po e ele imprimirá o objeto como este no console do lldb,

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

Registrando em arquivo 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)!)
  }
}

Agora, usando imprimir para transmitir,

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

Imprime em arquivo:

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

Agora, no depurador lldb, se você usar o comando po,

> po person

O resultado seria algo assim,

<name: Jack, addresses: Tampere Helsinki  0x7feb82f26e80>
  - name : "Jack"
  ▿ address1 : Address
    - city : "Helsinki"
  ▿ address2 : Address
    - city : "Tampere"
Sandeep
fonte
Também não está funcionando para mim no Xcode 7beta4. Chamar print("foo", appendNewLine: false)compila, mas a saída é (foo), falsee uma nova linha é acrescentada de qualquer maneira!
mluisbrown
@mluisbrown é appendNewline(caixa baixa l)
JeremyP
11

No Swift 2.0, você pode fazer isso:

Versão 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 e terminador

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

Usando uma variável

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

Usando duas variáveis

var hello = "Hello"
var world = "World"
print (hello, world)
result "Hello World\n"
Morten Gustafsson
fonte
Por padrão, o separador é um espaço" "
Jayram Kumar,
4

Se você quiser a mesma linha no loop:

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

Resultado: 1 2 3 4

PVCS
fonte