タイトル: print でデバッグ出力
SEOタイトル: Swift print 関数 完全ガイド(debugPrint / dump / 区切り文字 / 改行制御 / 本番リリース対策)
| この記事の要点 |
|
print 関数とは
print() は Swift で最もよく使われるデバッグ出力関数です。引数に渡した値を Xcode のデバッグエリア(コンソール)に表示します。標準ライブラリに組み込まれており、追加 import なしで使えます。
var str = "Hello, playground"
print(str)
// 出力: Hello, playground
let count = 42
print("件数:", count)
// 出力: 件数: 42
シグネチャ
public func print(
_ items: Any...,
separator: String = " ",
terminator: String = "\n"
)
| 引数 | 役割 | 既定値 |
|---|---|---|
items | 出力する値(可変長) | 必須 |
separator | items の区切り文字 | 半角スペース |
terminator | 出力の末尾文字 | 改行 \n |
複数の値を一括出力
let name = "Alice"
let age = 30
let city = "Tokyo"
print(name, age, city)
// 出力: Alice 30 Tokyo
print(name, age, city, separator: " / ")
// 出力: Alice / 30 / Tokyo
print(name, age, city, separator: "\n")
// 出力:
// Alice
// 30
// Tokyo
改行を抑制する
terminator: "" を指定すると改行されずに連続して出力できます。プログレス表示で便利。
for i in 1...5 {
print(i, terminator: " ")
}
print() // 最後に改行
// 出力: 1 2 3 4 5
文字列補間でフォーマット
let price = 1280
let tax = 0.10
print("税込: \(Int(Double(price) * (1 + tax)))円")
// 出力: 税込: 1408円
// 小数点桁数の制御は String(format:) を使う
let pi = Double.pi
print(String(format: "π = %.3f", pi))
// 出力: π = 3.142
print vs debugPrint vs dump
| 関数 | 出力 | 用途 |
|---|---|---|
print() | 人間向け(簡潔) | 通常のデバッグ表示 |
debugPrint() | プログラマ向け(型情報あり) | String を "..." で囲んで出すなど |
dump() | オブジェクトの内部構造を再帰表示 | 構造体・配列の中身を全部見たい時 |
struct User {
let name: String
let age: Int
let tags: [String]
}
let u = User(name: "Alice", age: 30, tags: ["swift", "ios"])
print(u)
// 出力: User(name: "Alice", age: 30, tags: ["swift", "ios"])
debugPrint(u)
// 出力: __lldb_expr.User(name: "Alice", age: 30, tags: ["swift", "ios"])
dump(u)
// 出力:
// ▿ User
// - name: "Alice"
// - age: 30
// ▿ tags: 2 elements
// - "swift"
// - "ios"
CustomStringConvertible で表示をカスタム
自作の型に CustomStringConvertible を実装すると、print で独自の表現が出せます。
struct Point: CustomStringConvertible {
let x: Int
let y: Int
var description: String { "(\(x), \(y))" }
}
let p = Point(x: 10, y: 20)
print(p)
// 出力: (10, 20)
本番リリース時の対策
print 文を残したまま App Store にリリースすると、無用なコンソール書き込みでパフォーマンスが落ちるうえ、機密情報が iOS のシステムログに残る恐れがあります。
// 方法1: コンパイル条件で切り分け
func debugLog(_ items: Any...) {
#if DEBUG
print(items.map { "\($0)" }.joined(separator: " "))
#endif
}
debugLog("ログイン成功", userID)
// 方法2: os_log / Logger (iOS 14+)
import OSLog
let logger = Logger(subsystem: "com.example.app", category: "network")
logger.debug("API レスポンス: \(response, privacy: .private)")
Logger は機密扱いのマーキングやカテゴリ別フィルタに対応し、Apple 公式が推奨する近年のロガーです。本番では Logger、開発時の手早い確認は print、という使い分けが現代的。
FAQ
Q: print が表示されない
A: Xcode 下部のデバッグエリアが閉じている。Shift + Command + Y で表示。デバイス実機の場合は Console.app でフィルタする。
Q: 配列の中身を綺麗に出したい
A: dump(array) で改行付き、または array.map { "\($0)" }.joined(separator: "\n") で 1 行ずつ。
Q: print の出力先を変えたい
A: 第二引数に TextOutputStream 準拠オブジェクトを渡せばファイル出力なども可能。print(text, to: &myStream)。
Q: NSLog との違いは?
A: NSLog はシステムログにも書き込まれタイムスタンプ付き。print は標準出力だけ。近年は Logger / os_log 推奨で、NSLog はレガシー扱い。