В swift 2.0, print()
автоматически добавляет символ новой строки. В swift 1.2, println()
и print()
использовались как отдельные функции. Итак, как мне печатать какой-то текст и не добавлять в него новую строку, так как у swift больше нет функции печати, которая не добавляет новые строки.
Печать без новой строки в swift
Ответ 1
Начиная с Swift 2.0, рекомендуемый способ печати без новой строки:
print("Hello", terminator:"")
Ответ 2
Функция печати полностью изменилась со времени поздней ревизии Swift, теперь она выглядит намного проще и есть вариант метода для печати на стандартной консоли.
Подпись метода для печати выглядит примерно так:
public func print<Target : OutputStreamType>(items: Any...,
separator: String = default,
terminator: String = default,
inout toStream output: Target)
Обратите внимание, что все остальные параметры, кроме элементов, принимают параметр по умолчанию, поэтому вы можете передавать их во время вызова, но они не являются обязательными.
Базовая версия
print("Swift is awesome.")
Печать
Swift is awesome.
Использование разделителя
Вы также можете использовать разделитель для объединения нескольких элементов и печати их на консоль,
print("Swift", "is", "awesome", separator:" ")
Отпечатки:
Свифт замечательный
Использование терминатора
print("Swift", "is", "awesome", separator:" ", terminator:".")
Печать
Swift is awesome.
При использовании терминатора он добавляет новые отпечатки в одну строку.
Конкатенация нескольких отпечатков
Предположим, что два печатаются следующим образом:
print("This is wild", terminator: " ")
print("world")
Это будет напечатано так,
This is wild world
Итак, используя терминатор, вы должны быть осторожны, чтобы содержимое было релевантным для той же строки.
Печать пользовательского объекта
Рассмотрим следующий класс Person, struct Address { let city: String }
class Person {
var name: String = "Jack"
var addresses:[Address] = [
Address(city: "Helsinki"),
Address(city: "Tampere")
]
}
Вы можете напечатать свою настраиваемую строку при печати экземпляра класса Person. Для этого вы можете соответствовать протоколу CustomStringConvertible.
Обзор Это текстовое представление используется, когда значения записываются к выходному потоку, например, путем печати.
extension Person: CustomStringConvertible {
var description: String {
return String(format: "<name: \(name) %p>", arguments:[unsafeAddressOf(self)])
}
}
let jack = Person()
print(jack)
Затем будет напечатано что-то вроде этого,
<name: Jack 0x7fba7061be00>
Считайте, что вы хотите использовать lldb для печати чего-то еще, возможно, более полезной информации. Затем вы должны сделать свой класс совместимым с CustomDebugCovertible, который очень похож на способ CustomStringConvertible,
Обзор Это текстовое представление используется, когда значения записываются к потоку вывода с помощью debugPrint и, как правило, более подробный, чем текст, предоставленный свойством CustomStringConvertible.
Это означает, что debugPrint использует эту информацию для печати на стандартный вывод.
Как вы можете это использовать?
Сопоставление класса Person с этим протоколом,
extension Person: CustomDebugStringConvertible {
var debugDescription: String {
return String(format: "<name: \(name), addresses: \(addresses.map{$0.city}.reduce("", combine:{ $1 + " " + $0 })) %p>", arguments:[unsafeAddressOf(self)])
}
}
Теперь вы можете использовать эту информацию с lldb debugger и использовать команду po (print object),
> po person
Печать
<name: Jack, addresses: Tampere Helsinki 0x7fd0ad80f280>
Одна из самых интересных вещей заключается в том, что вы также можете предоставить свой собственный поток, используя протокол Streamable, для которого требуется реализовать метод write (string: String). С этим вы можете создать свой собственный сетевой регистратор, регистратор файлов или другой механизм печати.
Вот простая версия моего простого регистратора файлов, которая работает с печатью или debugPrint,
struct MyStreamer: OutputStreamType {
lazy var fileHandle: NSFileHandle? = {
let fileHandle = NSFileHandle(forWritingAtPath: self.logPath)
return fileHandle
}()
lazy var logPath: String = {
let path : NSString = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true).first!
let filePath = (path as NSString).stringByAppendingPathComponent("log.txt")
if !NSFileManager.defaultManager().fileExistsAtPath(filePath) {
NSFileManager.defaultManager().createFileAtPath(filePath, contents: nil, attributes: nil)
}
print(filePath)
return filePath
}()
mutating func write(string: String) {
print(fileHandle)
fileHandle?.seekToEndOfFile()
fileHandle?.writeData(string.dataUsingEncoding(NSUTF8StringEncoding)!)
}
}
Теперь я могу создать экземпляр Streamer и использовать его в качестве целевого потока для печати, затем все мои журналы идут в файл,
var myStream = MyStreamer()
print("First of all", toStream: &myStream )
print("Then after", toStream: &myStream)
print("And, finally", toStream: &myStream)
Теперь мой файл содержит следующие журналы,
First of all
Then after
And finally
Теперь есть еще одна интересная команда, связанная с печатью, которую я хочу упомянуть,
Соответствие CustomReflectable дает другую перспективу, как вы смотрите на объект и отладчик журнала,
extension Person: CustomReflectable {
func customMirror() -> Mirror {
print("Mirror is called now")
return Mirror(self, children: ["name": name, "address1": addresses[0], "address2": addresses[1]])
}
}
Теперь, в lldb debugger, если вы используете команду po,
> po person
Результат будет примерно таким,
▿ <name: Jack, addresses: Tampere Helsinki 0x7feb82f26e80>
- name : "Jack"
▿ address1 : Address
- city : "Helsinki"
▿ address2 : Address
- city : "Tampere"
Ответ 3
В 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