Swift Standard Libraryに含まれるグローバル関数を全て調べてみました。
Pythonの公式ドキュメント「組み込み関数」のような、importなしで使える関数の一覧を見てみたかったのが動機です。
調査方法
Xcode 15.4 で command+shift+0
を押して開発者ドキュメントを開き、左下にある Filter でフレームワークSwiftの「func」で検索し、グローバルな関数だけを目grepして集めました。
Swiftでは演算子も (+)(2, 3) == 5
のように関数の一種として捉えることができますが、今回は除外しています。Deprecated(非推奨)な関数も除外しています。
調査結果
全46個のグローバル関数が見つかりました。
学習における各関数の重要度を、ChatGPT先生に3つの段階で分類してもらいました。
-
重要度:必須 (8個)
Swiftの基本的なプログラミングにおいて頻繁に使われる重要な関数です。これらはSwift学習者が早い段階で学習すべきであり、日常的に使うことが多いです。 -
重要度:実用的 (24個)
使う場面が限定的ながら、ある特定のコンテキストで有効な関数が含まれています。 -
重要度:特殊 (14個)
ほとんどの開発者が日常的に使わない、特殊な状況でのみ使用される関数です。
重要度ごとに関数を紹介していきます。
全46個をまとめて見たい方はこちら (クリックして展開)
関数名 | カテゴリ | iOS | 重要度 |
---|---|---|---|
abs | Global Numeric Functions | 8.0+ | 必須 |
all | SIMD Vector Types | 8.0+ | 特殊 |
any | SIMD Vector Types | 8.0+ | 特殊 |
assert | Debugging and Reflection | 8.0+ | 必須 |
assertionFailure | Debugging and Reflection | 8.0+ | 実用的 |
debugPrint | Debugging and Reflection | 8.0+ | 実用的 |
dump | Debugging and Reflection | 8.0+ | 実用的 |
fatalError | Debugging and Reflection | 8.0+ | 必須 |
getVaList | C Interoperability | 8.0+ | 特殊 |
isKnownUniquelyReferenced | Managed Buffers | 8.0+ | 実用的 |
max | Global Numeric Functions | 8.0+ | 必須 |
min | Global Numeric Functions | 8.0+ | 必須 |
numericCast | Special-Use Numeric Types | 8.0+ | 実用的 |
pointwiseMax | SIMD Vector Types | 8.0+ | 特殊 |
pointwiseMin | SIMD Vector Types | 8.0+ | 特殊 |
precondition | Debugging and Reflection | 8.0+ | 必須 |
preconditionFailure | Debugging and Reflection | 8.0+ | 実用的 |
Debugging and Reflection | 8.0+ | 必須 | |
readLine | Input and Output | 8.0+ | 実用的 |
repeatElement | Collections | 8.0+ | 実用的 |
sequence | Collections | 8.0+ | 実用的 |
stride | Collections | 8.0+ | 実用的 |
swap | Manual Memory Management | 8.0+ | 実用的 |
transcode | Unicode | 8.0+ | 特殊 |
type | Debugging and Reflection | 8.0+ | 特殊 |
unsafeBitCast | Type Casting and Existential Types | 8.0+ | 特殊 |
unsafeDowncast | Type Casting and Existential Types | 8.0+ | 特殊 |
withCheckedContinuation | Concurrency | 13.0+ | 実用的 |
withCheckedThrowingContinuation | Concurrency | 13.0+ | 実用的 |
withDiscardingTaskGroup | Concurrency | 17.0+ | 特殊 |
withExtendedLifetime | Manual Memory Management | 8.0+ | 実用的 |
withoutActuallyEscaping | Type Casting and Existential Types | 8.0+ | 実用的 |
withTaskCancellationHandler | Concurrency | 13.0+ | 実用的 |
withTaskGroup | Concurrency | 13.0+ | 実用的 |
withThrowingDiscardingTaskGroup | Concurrency | 17.0+ | 特殊 |
withThrowingTaskGroup | Concurrency | 13.0+ | 実用的 |
withUnsafeBytes | Manual Memory Management | 8.0+ | 実用的 |
withUnsafeContinuation | Concurrency | 13.0+ | 実用的 |
withUnsafeCurrentTask | Concurrency | 13.0+ | 特殊 |
withUnsafeMutableBytes | C Interoperability | 8.0+ | 実用的 |
withUnsafeMutablePointer | C Interoperability | 8.0+ | 実用的 |
withUnsafePointer | Manual Memory Management | 8.0+ | 実用的 |
withUnsafeTemporaryAllocation | Manual Memory Management | 8.0+ | 特殊 |
withUnsafeThrowingContinuation | Concurrency | 13.0+ | 実用的 |
withVaList | C Interoperability | 8.0+ | 特殊 |
zip | Collections | 8.0+ | 必須 |
重要度:必須
関数名 | カテゴリ | iOS |
---|---|---|
abs | Global Numeric Functions | 8.0+ |
assert | Debugging and Reflection | 8.0+ |
fatalError | Debugging and Reflection | 8.0+ |
max | Global Numeric Functions | 8.0+ |
min | Global Numeric Functions | 8.0+ |
precondition | Debugging and Reflection | 8.0+ |
Debugging and Reflection | 8.0+ | |
zip | Collections | 8.0+ |
-
abs(_:)
符号付き数値の絶対値を求めます。abs(-12) == 12
-
assert(_:_:file:line:)
デバッグ時に、条件が偽の場合に実行時エラーを出します。 -
fatalError(_:file:line:)
エラーを出してプログラムを強制終了します。 -
max(_:_:)
,max(_:_:_:_:)
2個以上の比較可能な値を受け取って最大値を返します。 -
min(_:_:)
,min(_:_:_:_:)
2個以上の比較可能な値を受け取って最小値を返します。 -
precondition(_:_:file:line:)
事前条件を確認し、偽の場合に実行時エラーを出します。 -
print(_:separator:terminator:)
標準出力を行う関数です。 -
zip(_:_:)
2つのシーケンスをペアにして新しいシーケンスを作成します。
アサーション系の関数(assert, fatalError, precondition)の使い分けが曖昧な方はチェックしておきましょう。
print関数のオプションや、zip関数に長さの異なるシーケンスを渡した時の挙動、max関数やmin関数に文字列を渡した時の挙動など、Pythonと共通する部分が多いことに気付いて個人的にテンションが上がっています。
重要度:実用的 (1/2)
関数名 | カテゴリ | iOS |
---|---|---|
assertionFailure | Debugging and Reflection | 8.0+ |
debugPrint | Debugging and Reflection | 8.0+ |
dump | Debugging and Reflection | 8.0+ |
isKnownUniquelyReferenced | Managed Buffers | 8.0+ |
numericCast | Special-Use Numeric Types | 8.0+ |
preconditionFailure | Debugging and Reflection | 8.0+ |
readLine | Input and Output | 8.0+ |
repeatElement | Collections | 8.0+ |
sequence | Collections | 8.0+ |
stride | Collections | 8.0+ |
swap | Manual Memory Management | 8.0+ |
-
assertionFailure(_:file:line:)
デバッグ時に実行時エラーを出します。assert関数の条件にfalseを渡すのと同じです。 -
debugPrint(_:separator:terminator:)
printと変わらないことが多いですが、オブジェクトをデバッグに適したテキスト表現で標準出力します。 -
dump(_:name:indent:maxDepth:maxItems:)
オブジェクトの内容をprintやdebugPrintよりも詳細に出力します。プロパティの値や階層構造を見やすく表示してくれるので、デバッグにとても有用です。 -
isKnownUniquelyReferenced(_:)
AnyObjectに適合するクラスオブジェクトが、他に強参照されていないか確認します。Copy-on-Write(CoW)という仕組みの実装に役立ちます。 -
numericCast(_:)
Int
やUInt
、Int8
、Int32
などの整数型から整数型への変換を行う関数です。
let a: Int8 = numericCast(UInt8(200))
のように変換後の型で表現できない数値が渡された場合は、実行時エラーになります。 -
preconditionFailure(_:file:line:)
実行時エラーを出します。precondition関数の条件にfalseを渡すのと同じです。 -
readLine(strippingNewline:)
標準入力から1行読み取ります。EOFでnil
が返ります。競プロでお馴染み。 -
repeatElement(_:count:)
指定した要素を指定回数繰り返すシーケンスを返します。Array.init(repeating:count:)
もそうですが、第 1 引数は@autoclosure
ではないので全ての要素は単一の実体を参照していることに注意が必要です。
for str in repeatElement("Hello", count: 3) {
print(str) // Hello Hello Hello
}
for user in repeatElement(User(), count: 3) {
print(ObjectIdentifier(user)) // 3つとも同一のインスタンス
}
-
sequence(first:next:)
,sequence(state:next:)
クロージャを使って次の値を生成するシーケンスを生成します。
for i in sequence(first: 1, next: { $0 == 128 ? nil : $0 * 2 }) {
print(i) // 1 2 4 8 16 32 64 128
}
for i in sequence(state: (0, 1), next: { state in
(state.0, state.1) = (state.1, state.0 + state.1)
return state.0
}).prefix(8) {
print(i) // 1 1 2 3 5 8 13 21
}
-
stride(from:to:by:)
,stride(from:through:by:)
指定された範囲内の一定間隔の値のシーケンスを生成します。
for i in stride(from: 10, to: 20, by: 2) {
print(i) // 10 12 14 16 18
}
for i in stride(from: 10, through: 20, by: 2) {
print(i) // 10 12 14 16 18 20
}
-
swap(_:_:)
swap(&a, &b)
のように変数の値を交換する時に使います。(a, b) = (b, a)
と書くよりも簡潔で、パフォーマンスやメモリ使用量の面でも優れています。
重要度:実用的 (2/2)
関数名 | カテゴリ | iOS |
---|---|---|
withCheckedContinuation | Concurrency | 13.0+ |
withCheckedThrowingContinuation | Concurrency | 13.0+ |
withExtendedLifetime | Manual Memory Management | 8.0+ |
withoutActuallyEscaping | Type Casting and Existential Types | 8.0+ |
withTaskCancellationHandler | Concurrency | 13.0+ |
withTaskGroup | Concurrency | 13.0+ |
withThrowingTaskGroup | Concurrency | 13.0+ |
withUnsafeBytes | Manual Memory Management | 8.0+ |
withUnsafeContinuation | Concurrency | 13.0+ |
withUnsafeMutableBytes | C Interoperability | 8.0+ |
withUnsafeMutablePointer | C Interoperability | 8.0+ |
withUnsafePointer | Manual Memory Management | 8.0+ |
withUnsafeThrowingContinuation | Concurrency | 13.0+ |
-
withCheckedContinuation(isolation:function:_:)
従来のcompletionHandlerによる非同期関数を、新方式のConcurrencyに適応させるための関数です。withUnsafeContinuation
と違って断続の呼び出しに関するミス(複数回呼び出してしまうなど)をチェックする機能がついているため、安全性が高いです。 -
withCheckedThrowingContinuation(isolation:function:_:)
withCheckedContinuation
のthrows版。失敗の可能性がある非同期処理で使用します。 -
withExtendedLifetime(_:_:)
,withExtendedLifetime(_:_:)
クロージャや非同期処理の途中で予期せずオブジェクトが解放されてしまうのを防ぐために、オブジェクトのライフタイムを明示的に延長したい時に使います。
let user = User()
DispatchQueue.global().async {
withExtendedLifetime(user) {
// このクロージャの実行が終わるまではuserは解放されない
user.doSomething()
}
}
-
withoutActuallyEscaping(_:do:)
nonescapingとして受け取ったクロージャを、一時的にescapingなクロージャとして扱うことができます。
第 1 引数で渡したnonescapingなクロージャをdo
クロージャ内ではエスケープすることができますが、実際にそのクロージャを保存してdo
終了後に利用することは未定義の操作となります。 -
withTaskCancellationHandler(operation:onCancel:isolation:)
Concurrencyでタスクがキャンセルされた時の処理を書くことができます。 -
withTaskGroup(of:returning:isolation:body:)
Concurrencyで複数の非同期タスクを並列に実行します。 -
withThrowingTaskGroup(of:returning:isolation:body:)
withTaskGroup
のthrows版。失敗の可能性がある非同期処理で使用します。 -
withUnsafeBytes(of:_:)
,withUnsafeBytes(of:_:)
指定した値の生のバイトデータに対して安全にアクセスできる関数です。低レベルなメモリ操作やバイナリデータの処理が必要な場面などで使用されます。クロージャに渡されるbuffer
は読み取り専用です。
var number: Int = 12 * 256 + 34
withUnsafeBytes(of: &number) { buffer in
for byte in buffer {
print(byte) // 34 12 0 0 0 0 0 0
}
}
-
withUnsafeContinuation(isolation:_:)
従来のcompletionHandlerによる非同期関数を、新方式のConcurrencyに適応させるための関数です。withCheckedContinuation
と違って断続の呼び出しに関するミス(複数回呼び出してしまうなど)をチェックする機能がついていません。 -
withUnsafeMutableBytes(of:_:)
指定した値の生のバイトデータに対して安全にアクセスできる関数です。withUnsafeBytes
と違ってbuffer
への書き込みができます。 -
withUnsafeMutablePointer(to:_:)
指定した値に対するポインタを使った処理を行うことができる関数です。withUnsafePointer
と違ってポインタへの書き込みができます。 -
withUnsafePointer(to:_:)
,withUnsafePointer(to:_:)
指定した値に対するポインタを使った処理を行うことができる関数です。CやObjective-Cとの相互運用や、低レベルなシステムプログラミングで使用されます。クロージャに渡されるポインタは読み取り専用です。 -
withUnsafeThrowingContinuation(isolation:_:)
withUnsafeContinuation
のthrows版。失敗の可能性がある非同期処理で使用します。
重要度:特殊
関数名 | カテゴリ | iOS |
---|---|---|
all | SIMD Vector Types | 8.0+ |
any | SIMD Vector Types | 8.0+ |
getVaList | C Interoperability | 8.0+ |
pointwiseMax | SIMD Vector Types | 8.0+ |
pointwiseMin | SIMD Vector Types | 8.0+ |
transcode | Unicode | 8.0+ |
type | Debugging and Reflection | 8.0+ |
unsafeBitCast | Type Casting and Existential Types | 8.0+ |
unsafeDowncast | Type Casting and Existential Types | 8.0+ |
withDiscardingTaskGroup | Concurrency | 17.0+ |
withThrowingDiscardingTaskGroup | Concurrency | 17.0+ |
withUnsafeCurrentTask | Concurrency | 13.0+ |
withUnsafeTemporaryAllocation | Manual Memory Management | 8.0+ |
withVaList | C Interoperability | 8.0+ |
all(_:)
-
any(_:)
SIMDMask
のBool
を使い状態を判別する関数です。any
はレーンのいずれかがtrue
であればtrue
、all
はレーンの全てがtrue
であればtrue
を返します。(出典)
let s8 = SIMD8<Float>(1,2,3,4,5,6,7,8)
any(s8 .< 3) // true
all(s8 .< 7) // false
all(s8 .< 9) // true
-
getVaList(_:)
CやObjective-Cの可変引数関数をSwiftで呼び出すために使用される関数です。withVaList
と違ってポインタを直接返すため、ポインタの管理は呼び出し側に委ねられます。特別な理由がなければwithVaList
を使用すべきです。 -
pointwiseMax(_:_:)
,pointwiseMax(_:_:)
2つのレーンを調べその中の最大値や最小値を設定したレーンを返します。(出典)
let s1 = SIMD3(0,1,2)
let s2 = SIMD3(2,1,0)
pointwiseMin(s1, s2) // SIMD3<Int>(0, 1, 0)
pointwiseMax(s1, s2) // SIMD3<Int>(2, 1, 2)
-
transcode(_:from:to:stoppingOnError:into:)
異なるUnicodeエンコーディング間の変換に使用する関数です。低レベルなUnicode操作が必要な場面で役立ちます。 -
type(of:)
渡された値の動的な型(ランタイムでの実際の型)を取得するための関数です。プロトコルで抽象化された値やジェネリックパラメータなどの型を調べる際に便利です。 -
unsafeBitCast(_:to:)
メモリ上のビット列そのままを、指定した型に解釈し直すための関数です。使用する際は、元の型と変換後の型が同じメモリサイズとレイアウトを持っていることを確認する必要があります。Swiftの型システムを無視した非常に危険な関数です。パフォーマンスが重要な場面で使用します。 -
unsafeDowncast(_:to:)
渡されたインスタンスを特定のクラス型にダウンキャストする関数です。そのインスタンスが常に指定した型であると完全に保証されている場合に使用します。Swiftの型安全性を破る関数であり、通常は型チェックの行われるas!
やas?
を使用すべきです。パフォーマンスが重要な場面で使用します。 -
withDiscardingTaskGroup(returning:isolation:body:)
Concurrencyで複数の非同期タスクを並列に実行します。withTaskGroup
と違って子タスクの完了時にその結果を保持せず、すぐに破棄します。タスクの結果ではなく、タスクが引き起こす副作用(ネットワークリクエストなど)にだけ興味がある場合に使用します。 -
withThrowingDiscardingTaskGroup(returning:isolation:body:)
withDiscardingTaskGroup
のthrows版。タスクがエラーをスローすると、その時点でタスクグループが自動的にキャンセルされ、最初にスローされたエラーを保持します。全タスクの終了を待ってから関数が終了し、保持されたエラーが再スローされます。 -
withUnsafeCurrentTask(body:)
現在のタスク(実行中の非同期処理)への一時的な参照を取得し、そのタスクの状態やプロパティにアクセスするための関数です。非同期関数の中では常に現在のタスクが返されますが、同期関数内ではタスクが存在しない場合があり、nil
が渡されることがあります。主に非同期処理のデバッグやタスクのモニタリング、最適化の目的で使用されます。以下は現在のタスクの優先度を取得する例です。
Task {
withUnsafeCurrentTask { task in
if let task = task {
print("Current task priority: \(task.priority)")
} else {
print("No task context available.")
}
}
}
-
withUnsafeTemporaryAllocation(of:capacity:_:)
,
withUnsafeTemporaryAllocation(byteCount:alignment:_:)
一時的にメモリを確保して、操作を行うための関数です。確保されたメモリはクロージャ内でのみ有効で、クロージャが終了した時点で自動的に解放されます。 -
withVaList(_:_:)
CやObjective-Cの可変引数関数をSwiftで呼び出すために使用される関数です。getVaList
と違ってクロージャ内でポインタを扱います。ポインタはクロージャのスコープ内でのみ有効であるため、メモリ安全性が高いです。
まとめ
全46個、思ったより少なかったこともあり全ての関数の詳細を調べることができて勉強になりました(特にConcurrency関連)。SIMDや低レベルのメモリ管理、C互換性に関係する関数は低い重要度に分類されている傾向があるようですね。
リストアップした時に、with
から始まる関数が18個、全体の4割近くを占めていたことには驚きました。