1
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Swift 5.10 組み込み関数一覧

Last updated at Posted at 2024-09-07

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+ 実用的
print 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+
print Debugging and Reflection 8.0+
zip Collections 8.0+

アサーション系の関数(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(_:)
    IntUIntInt8Int32などの整数型から整数型への変換を行う関数です。
    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つとも同一のインスタンス
}
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
}
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(_:)
    SIMDMaskBoolを使い状態を判別する関数です。anyはレーンのいずれかがtrueであればtrueallはレーンの全てが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を使用すべきです。

  • pointwiseMin(_:_:), pointwiseMin(_:_:)

  • 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割近くを占めていたことには驚きました。

1
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?