drukuj bez nowej linii w szybkim tempie

110

W swift 2.0 print()automatycznie dodaje znak nowej linii. W swift 1.2 println()i print()były oddzielnymi funkcjami. Jak więc wydrukować jakiś tekst i nie dodawać do niego nowej linii, skoro swift nie ma już funkcji drukowania, która nie dodaje nowych linii.

Ankit Goel
źródło
3
@ DánielNagy To nie jest duplikat, ponieważ swift 2.0 nie ma funkcji println. Nie pytam jak drukować na konsolę, bo funkcja print to zrobi. Pytam „Jak drukować na konsoli bez nowej linii dołączonej do tekstu wejściowego”
Ankit Goel
2
Jest to wyraźnie udokumentowane w informacjach o wydaniu beta Xcode 7: „println i print zostały połączone w jedną funkcję drukowania z domyślnym argumentem…”
Martin R

Odpowiedzi:

208

Począwszy od Swift 2.0, zalecana metoda drukowania bez znaku nowej linii to:

print("Hello", terminator:"")
Cheniel
źródło
Mimo że widzisz tylko interfejs z seperatorparametrem. Możesz go po prostu zignorować, ponieważ ma wartość domyślnąfunc print(items: Any..., separator: String = default, terminator: String = default)
Binarian
2
Gdzie w dokumentach Swift ktoś dowiedziałby się, co defaultjest równe?
7stud
1
@ 7stud defaultto symbol zastępczy wartości domyślnej. W idealnym przypadku dokumentacja powinna zawierać rzeczywistą wartość, a nie symbol zastępczy.
Sulthan
1
Wartości domyślne to: separator "" (pojedyncza spacja) i terminator \ n (nowa linia)
selva
68

printfunkcja zmieniła się całkowicie od późnej wersji Swift , teraz wygląda na znacznie prostszą i istnieje wariant metody drukowania na standardową konsolę.

Podpis metody dla print wygląda mniej więcej tak,

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

A oto kilka zastosowań,

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

Wydruki:

Swift is awesome.
Swift is awesome
Swift is awesome.

Łączenie

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

Wydruki:

This is wild world

Dlatego używając terminatora, należy uważać, aby zawartość dotyczyła tego samego wiersza.

Drukowanie obiektu za pomocą 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)

Wydruki:

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

Teraz, z lldb , możesz użyć polecenia po i wypisze obiekt jako ten w konsoli lldb,

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

Rejestrowanie do pliku przy użyciu 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)!)
  }
}

Teraz, używając drukowania do przesyłania strumieniowego,

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

Wydruki do pliku:

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

Teraz, w debugerze lldb, jeśli używasz polecenia po,

> po person

Wynik byłby podobny do tego,

<name: Jack, addresses: Tampere Helsinki  0x7feb82f26e80>
  - name : "Jack"
  ▿ address1 : Address
    - city : "Helsinki"
  ▿ address2 : Address
    - city : "Tampere"
Sandeep
źródło
Również nie działa dla mnie w Xcode 7beta4. Wywołanie print("foo", appendNewLine: false)kompiluje, ale wynik jest, (foo), falsea nowa linia i tak jest dodawana!
mluisbrown
@mluisbrown to appendNewline(małe litery l)
JeremyP
11

W Swift 2.0 możesz to zrobić:

Wersja podstawowa

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

Korzystanie z terminatora

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

Korzystanie z separatora

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

Używanie separatora i terminatora

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

Korzystanie z jednej zmiennej

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

Korzystanie z dwóch zmiennych

var hello = "Hello"
var world = "World"
print (hello, world)
result "Hello World\n"
Morten Gustafsson
źródło
Domyślnie separatorem jest spacja" "
Jayram Kumar
4

Jeśli chcesz, aby ta sama linia była zapętlona:

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

Wyjście: 1 2 3 4

PVCS
źródło