друк без нової лінії швидко


110

У швидкості 2.0 print()автоматично додається символ нового рядка. У швидкому 1.2, println()і print()раніше він був окремими функціями. Тож як я надрукую деякий текст і не додаю до нього новий рядок, оскільки у swift більше немає функції друку, яка не додає нові рядки.



3
@ DánielNagy Це не дублікат, тому що у swift 2.0 немає функції println. Я не запитую, як друкувати на консоль, тому що це буде виконувати функція друку. Я запитую "Як надрукувати на консоль без додавання нового рядка до введення тексту"
Ankit Goel

2
Це чітко задокументовано у примітках до бета-версії Xcode 7: "println та print були об'єднані в одну функцію друку з аргументом за замовчуванням ..."
Martin R

Відповіді:


208

Починаючи з Swift 2.0, рекомендований спосіб друку без нового рядка:

print("Hello", terminator:"")

Навіть незважаючи на те, що ви бачите лише інтерфейс з seperatorпараметром. Ви можете просто проігнорувати його, оскільки воно має значення за замовчуваннямfunc print(items: Any..., separator: String = default, terminator: String = default)
Binarian

2
Де в документах Swift хтось дізнається, що defaultдорівнює?
7stud

1
@ 7stud default- заповнювач місця для значення за замовчуванням. В ідеалі документація повинна містити фактичне значення, а не заповнювач.
Султан

1
Значення за замовчуванням: роздільник "" (один пробіл) та термінатор \ n (новий рядок)
selva

68

printФункція повністю змінилася з пізньої редакції Swift , тепер вона виглядає набагато простіше і є варіант способу друку на стандартну консоль.

Підпис методу для друку виглядає приблизно так,

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

Ось кілька випадків використання,

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

Друкує:

Swift is awesome.
Swift is awesome
Swift is awesome.

Сполучення

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

Друкує:

This is wild world

Тож, використовуючи термінатор, слід бути обережним, щоб вміст відповідав одному рядку.

Друк об'єкта за допомогою 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)

Друкує:

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

Тепер, за допомогою lldb , ви можете використовувати команду po, і вона буде друкувати об'єкт таким чином на консолі lldb,

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

Реєстрація у файл за допомогою 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)!)
  }
}

Тепер, використовуючи print для передачі,

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

Друкує до файлу:

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

Тепер у відладчику lldb, якщо ви використовуєте команду po,

> po person

Результат був би таким,

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

Також не працює для мене в Xcode 7beta4. Виклик print("foo", appendNewLine: false)компілюється, але вихід є, (foo), falseі новий рядок додається все одно!
mluisbrown

@mluisbrown it appendNewline(нижній регістр l)
JeremyP

11

У Swift 2.0 ви можете зробити це:

Базова версія

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

Використання термінатора

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

Використання роздільника

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

Використання сепаратора та термінатора

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

Використання однієї змінної

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

Використання двох змінних

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

За замовчуванням роздільник є пробілом" "
Джейрам Кумар

4

Якщо ви хочете той самий рядок у циклі:

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

Вихід: 1 2 3 4

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.