2015-06-16 14 views
73

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

+0

possibile duplicato di [? Come stampare per consolare utilizzando rapida parco giochi] (http://stackoverflow.com/questions/24003092/how-to-print-to-console -uso-rapido-parco giochi) –

+2

@ 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à. Sto chiedendo "Come stampare su console senza la newline aggiunta al testo" –

+1

Questo è esplicitamente documentato nelle note di rilascio della versione beta di Xcode 7: * "println e print sono stati uniti in una singola funzione di stampa con un argomento predefinito .. . "* –

risposta

129

A partire dal Swift 2.0, il metodo consigliato di stampare senza ritorno a capo è:

print("Hello", terminator:"") 
+0

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

+2

Ora è ufficiale su Xcode 7 – lenhhoxung

+1

Dove nei documenti Swift qualcuno dovrebbe scoprire a cosa corrisponde "predefinito"? – 7stud

55

print la funzione è completamente cambiata dalla revisione tardiva di Swift, ora sembra molto più semplice e ci sono varianti di 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. 

Concatenazione

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

Stampe:

This is wild world 

Quindi, utilizzando terminator, si deve fare attenzione che i contenuti sono rilevanti per la stessa linea.

Stampa Oggetto 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, è possibile utilizzare po comando e stamperà oggetto come questo in 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, utilizzando 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 si utilizza il comando Po,

> po person 

risultato sarebbe qualcosa in questo modo,

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

Questo non funziona nel repl rapido e nel parco giochi. –

+0

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

+0

@mluisbrown è 'appendNewline' (minuscolo' l') – JeremyP

8

In Swift 2.0 si può fare questo:

Versione base

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

Utilizzando terminatore

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

Utilizzando separatore

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

Utilizzando 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" 
3

Se volete stessa linea in loop:

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

di uscita: 1 2 3 4