快速打印无需换行

在swift 2.0中, print()自动添加换行符。 在swift 1.2中, println()print()是分开的函数。 那么如何打印一些文本,而不是添加一个换行符,因为swift不再具有不附加换行符的打印function。

从Swift 2.0开始,没有换行的推荐方法是:

 print("Hello", terminator:"") 

打印function已经完全改变了,因为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类的实例时,可以打印自定义string。 为此,您可以遵守CustomStringConvertible协议。

概述当值被写入输出stream时,例如通过打印,使用这种文本表示。

 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将值写入输出stream时使用此文本表示 ,通常比CustomStringConvertible的 description属性提供的文本更详细。

这意味着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)]) } } 

现在,你可以用lldbdebugging器使用这个信息并使用po(打印对象)命令,

 > po person 

打印,

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

关于这一切的一个很酷的事情是你也可以使用Streamable协议提供你自己的自定义stream,这需要你实现方法write(string:String) 。 有了这个,你可以创build自己的networkinglogging器,文件logging器或其他forms的打印机制。

这是我简单的文件logging器的简单版本,可以与print或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)!) } } 

我现在可以创build一个Streamer的实例,并将其用作打印的目标stream,然后将所有日志logging到该文件中,

 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再次给出了一个不同的观点,你如何看待对象和日志debugging器,

 extension Person: CustomReflectable { func customMirror() -> Mirror { print("Mirror is called now") return Mirror(self, children: ["name": name, "address1": addresses[0], "address2": addresses[1]]) } } 

现在,在lldbdebugging器中,如果你使用命令po,

 > po person 

结果会是这样的,

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

在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" 

使用一个variables

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

使用两个variables

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

如果你想在循环中使用同一行:

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

输出:1 2 3 4