改行なしで迅速に印刷する


110

Swift 2.0では、print()自動的に改行文字が追加されます。Swift 1.2ではprintln()print()以前は個別の機能でした。それでは、swiftには改行を追加しない印刷機能がなくなったため、テキストを印刷して改行を追加しないようにするにはどうすればよいですか。



3
@DánielNagyswift 2.0にはprintln関数がないため、複製ではありません。印刷機能がそれを行うので、コンソールに印刷する方法を尋ねていません。「入力テキストに改行を追加せずにコンソールに出力する方法」を質問しています
Ankit Goel

2
:これは、明示的にXcodeの7ベータ版のリリースノートに記載されて「のprintlnと...デフォルトの引数を持つ単一の印刷機能にマージされているプリント」
マーティンR

回答:


208

Swift 2.0以降、改行なしで印刷するための推奨方法は次のとおりです。

print("Hello", terminator:"")

seperatorパラメータ付きのインターフェースしか表示されませんが。デフォルト値があるため、単純に無視できますfunc print(items: Any..., separator: String = default, terminator: String = default)
Binarian

2
Swiftのドキュメントのどこで、どこdefaultが等しいのかわかるでしょうか?
2016年

1
@ 7stud defaultはデフォルト値のプレースホルダーです。理想的には、ドキュメントにはプレースホルダーではなく実際の値を含める必要があります。
スルタン2016

1
デフォルト値は次のとおりです:セパレーター ""(単一スペース)およびターミネーター\ n(改行)
セルバ

68

printSwiftの最新のリビジョン以降、関数は完全に変更されました。現在ははるかにシンプルに見え、標準のコンソールに出力するメソッドのバリアントがあります。

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

カスタム反射可能

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 2015

@mluisbrown it's appendNewline(lower case 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"

1つの変数を使用する

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

2つの変数の使用

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

デフォルトでは、区切り文字はスペースです" "
Jayram Kumar

4

ループ内に同じ行が必要な場合:

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

出力:1 2 3 4

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.