快速打印无需换行
在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