【问题标题】:print without newline in swift快速打印没有换行符
【发布时间】:2015-09-01 03:11:36
【问题描述】:

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

【问题讨论】:

  • @DánielNagy 这不是重复的,因为 swift 2.0 没有 println 函数。我不是在问如何打印到控制台,因为打印功能会这样做。我在问“如何在不将换行符附加到输入文本的情况下打印到控制台”
  • Xcode 7 beta 发行说明中明确记录了这一点:"println 和 print 已合并为一个带有默认参数的打印函数..."跨度>

标签: swift swift3 swift2


【解决方案1】:

print 函数自 Swift 的后期版本以来已经完全改变,现在它看起来更简单了,并且有多种方法可以打印到标准控制台。

print 的方法签名看起来像这样,

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 它是appendNewline(小写l
【解决方案2】:

从 Swift 2.0 开始,推荐的不换行打印方法是:

print("Hello", terminator: "")

【讨论】:

  • 即使您只看到带有seperator 参数的界面。你可以直接忽略它,因为它有一个默认值func print(items: Any..., separator: String = default, terminator: String = default)
  • 在 Swift 文档中的哪里可以找到 default 等于什么?
  • @7stud default 是默认值的占位符。理想情况下,文档应该包含实际值,而不是占位符。
  • 默认值是:分隔符“”(一个空格)和终止符\n(换行)
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 2017-06-09
    • 2013-05-12
    • 1970-01-01
    相关资源
    最近更新 更多