быстро печатать без новой строки

110

В Swift 2.0 print()автоматически добавляется символ новой строки. В swift 1.2 println()и print()раньше были отдельные функции. Итак, как мне напечатать какой-то текст и не добавлять к нему новую строку, поскольку в swift больше нет функции печати, которая не добавляет новые строки.

Анкит Гоэль
источник
3
@ DánielNagy Это не дубликат, потому что swift 2.0 не имеет функции println. Я не спрашиваю, как печатать на консоли, потому что это сделает функция печати. Я спрашиваю «Как печатать на консоли без добавления новой строки к вводимому тексту»
Анкит Гоэль
2
Это явно задокументировано в примечаниях к выпуску бета-версии Xcode 7: «println и print были объединены в одну функцию печати с аргументом по умолчанию ...»
Мартин Р.

Ответы:

208

Начиная с Swift 2.0, рекомендуемый метод печати без новой строки:

print("Hello", terminator:"")
Cheniel
источник
Хотя вы видите только интерфейс с seperatorпараметром. Вы можете просто игнорировать его, потому что у него есть значение по умолчаниюfunc print(items: Any..., separator: String = default, terminator: String = default)
Binarian,
2
Где в документации Swift кто-нибудь узнает, что defaultравно?
7stud 06
1
@ 7stud default- это значение по умолчанию. В идеале документация должна содержать фактическое значение, а не заполнитель.
Султан
1
Значения по умолчанию: разделитель "" (одиночный пробел) и терминатор \ n (новая строка)
сельва
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("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"
Sandeep
источник
Также не работает у меня в Xcode 7beta4. Вызов print("foo", appendNewLine: false)компиляции, но вывод есть, (foo), falseи новая строка все равно добавляется!
mluisbrown
@mluisbrown это 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"
Мортен Густафссон
источник
По умолчанию разделителем является пробел" "
Джейрам Кумар 02
4

Если вам нужна такая же строка в цикле:

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

Выход: 1 2 3 4

PVCS
источник