パターン


パターン は、一つの値または複合した値の構造体を表します。例えば、タプル (1,2) の構造体は、2つの要素をカンマで区切ったリストです。パターンは一つの特定の値ではなく値の構造体を表すので、各種の値をそれらと一致させることができます。例えば、パターン (x,y) は、タプル (1,2) と一致し、他の2つの要素のタプルどれにでも一致します。パターンが値と一致するだけでなく、複合した値の一部または全部を抽出して、定数または変数名に各部分を結合できます。


Swift には、パターンには2種類の基本的なものがあります:どのような種類の値とも首尾よく一致するものと、実行時に指定された値と一致しないものがあります。


最初の種類のパターンは、単純な変数、定数、および optional の結合の値の構造を解消するために使用されます。これには、ワイルドカードパターン、識別子パターン、およびそれらを含む全ての値結合パターンまたはタプルパターンを含みます。これらのパターンの型注釈を指定して、特定の型の値とのみ一致するようにそれらを制約できます。


2番目の種類のパターンは、完全パターン一致に使用され、一致させようとする値は実行時には存在しないかもしれません。これは、列挙型 case パターン、optional パターン、式パターン、および型キャストパターンを含みます。これらのパターンは、switch 文の case ラベル、do 文の catch 句、if、while、guard、 または for-in 文の case 条件の場合に使用します。


パターンの文法

patternwildcard-pattern ­­type-annotation­ ­opt
patternidentifier-pattern ­­type-annotation­ ­opt
patternvalue-binding-pattern
patterntuple-pattern ­type-annotation ­opt
patternenum-case-pattern
patternoptional-pattern
­ patterntype-casting-pattern­
patternexpression-pattern




ワイルドカードパターン


ワイルドカードパターン は、アンダースコア (_) で構成されており、一致する全ての値を無視します。値が一致するか気にしない時にはワイルドカードパターンを使用してください。たとえば、以下のコードはループの各反復で範囲の現在の値を無視し、閉じた範囲 1...3 を通じて反復します:


  1. for _ in 1...3 {
  2.         // Do something three times.
  3. }


ワイルドカードパターンの文法

wildcard-pattern_



識別子パターン


識別子パターン は、全ての値に一致し、変数または定数名に一致した値を結合します。たとえば、以下の定数の宣言で、someValue は、Int 型の値 42 と一致する識別子パターンです。


let someValue = 42



一致が成功した場合には、値 42 は、定数名 someValue に (代入され) 結合されます。


変数または定数宣言の左側のパターンが識別子パターンである場合には、識別子パターンは、暗黙的に値結合パターンのサブパターンです。


識別子パターンの文法

identifier-patternidentifier



値結合パターン


値結合パターン は、変数や定数名に一致した値を結合します。let キーワードで始まる定数の名前に一致した値を結合する値結合パターン。var キーワードで始まる変数の名前に結合するもの。


値結合パターン内の識別子パターンは、それらの一致する値に新しい名前の変数や定数を結合します。たとえば、タプルの要素を分解することができるし、対応する識別子パターンに各要素の値を結合できます。


  1. let point = (3, 2)
  2. switch point {
  3. // Bind x and y to the elements of point.
  4. case let (x, y):
  5.         println("The point is at (\(x), \(y)).")
  6. }
  7. // prints "The point is at (3, 2)."


上記の例では、let はタプルパターン (x,y) の各識別子パターンに振り分けます。この動作のため、switch case の case let (x,y): と、case (let x, let y): は、同じ値に一致します。



値結合パターンの文法

value-binding-patternvar pattern | let pattern



タプルパターン


タプルパターン は、括弧で囲まれたゼロ個以上のパターンのカンマで区切られたリストです。タプルパターンは、対応するタプル型の値と一致します。


型注釈を使用してタプル型の特定の種類に一致させてタプルパターンを制約できます。例えば、定数宣言では、let (x,y): (Int, Int) = (1,2) 内の (x, y): (Int, Int) タプルパターンは、両方の要素が Int 型のタプル型の時だけ一致します。


タプルパターンを for-in 文の中でパターンとして使用する場合、または変数または定数宣言で使う場合は、それはワイルドカードパターン、識別子パターン、optional パターン、またはそれらを含む他のタプルパターンしか含むことができません。例えば、タプルパターン (x, 0) の要素 0 は式のパターンであるため、以下のコードは有効ではありません。



  1. let points = [(0, 0), (1, 0), (1, 1), (2, 0), (2, 1)]
  2. // This code isn't valid.
  3. for (x, 0) in points {
  4.         /* ... */
  5. }


一つの要素を含むタプルパターンの周りの括弧は効果がありません。パターンは、その一つの要素の型の値と一致します。たとえば、以下は同じです。


  1. let a = 2                // a: Int = 2
  2. let (a) = 2              // a: Int = 2
  3. let (a): Int = 2       // a: Int = 2



タプルパターンの文法

tuple-pattern tuple-pattern-element-list ­opt ­)
tuple-pattern-element-listtuple-pattern-element | tuple-pattern-element ­, ­tuple-pattern-element-list­
tuple-pattern-elementpattern | identifier : pattern



列挙型 case パターン


列挙型 case パターン は、既存の列挙型の case に一致します。列挙型 case パターンは、switch 文の case ラベルに表れ、if,while,guard, 及び for-in 文の case 条件に現れます。


一致させようとしている列挙型 case に何らかの関連する値がある場合は、対応する列挙型 case パターンは、それぞれ関連した値に1つの要素を含むタプルパターンを指定しなければなりません。関連する値を含む列挙型 case に一致するように switch 文を使用する例については、関連する値 を参照してください。



列挙型 case パターンの文法

enum-case-patterntype-identifier ­opt ­. enum-case-name ­tuple-pattern ­opt



Optional パターン


optional パターン は、optional<Wrapped> 列挙型の some(Wrapped) case で包み込まれた値と一致します。Optional パターンは、識別子パターンとその直後に続く疑問符で構成され、列挙型 case パターンと同じ場所に表示されます。


optional パターンは Optional の列挙型の case パターンのシンタクティックシュガーなので、以下は同等です:


  1. let someOptional: Int? = 42
  2. // Match using an enumeration case pattern.
  3. if case .some(let x) = someOptional {
  4.         print(x)
  5. }
  6. // Match using an optional pattern.
  7. if case let x? = someOptional {
  8.         print(x)
  9. }


optional パターンは、for-in 文内の optional 値の配列を反復処理する便利な方法を提供し、ループの本体を nil 以外の要素に対してのみ実行します。


  1. let arrayOfOptionalInts: [Int?] = [nil, 2, 3, nil, 5]
  2. // Match only non-nil values.
  3. for case let number? in arrayOfOptionalInts {
  4.         print("Found a \(number)")
  5. }
  6. // Found a 2
  7. // Found a 3
  8. // Found a 5


Optional パターンの文法

optional-patternidentifier-pattern­



型キャストパターン


型キャストパターンには2つあり、is パターンと as パターンです。is パターンは switch 文の case ラベルにのみ表れます。isas パターンは、以下の形式です:


is

as



実行時に、その値の型が、is パターンまたはその型のサブクラスの右側に指定された型と同じである場合、 is パターンは値と一致します。is パターンは is 演算子のように動作し、どちらも型キャストを行いますが、返された型を捨てます。


実行時に、その値の型が、 as パターンまたはその型のサブクラスの右側に指定された型と同じである場合、as パターンは値と一致します。一致が成功した場合、一致した値の型は、as パターンの右側に指定された パターン にキャストされます。


isas パターンで、値と一致するように、switch 文を使用する例については、Any と AnyObject 用の型キャスティング を参照してください。


型キャストパターンの文法

type-casting-patternis-pattern | as-pattern
is-patternis ­type
as-patternpattern as ­type



­

式のパターン


式のパターン は、式の値を表します。式のパターンは switch 文の case ラベルにのみ表れます。


式のパターンによって表される式は、Swift 標準ライブラリの ~= 演算子を使用した入力式の値と比較されます。~= 演算子が true を返す場合一致は成功しています。デフォルトでは、~= 演算子は == 演算子を使用して、同じ型の2つの値を比較します。以下の例に示すように、それはまた、値が範囲内に含まれているかどうかをチェックすることによって、値の範囲と値を一致させることもできます。


  1. let point = (1, 2)
  2. switch point {
  3. case (0, 0):
  4.         print("(0, 0) is at the origin.")
  5. case (-2...2, -2...2):
  6.         print("(\(point.0), \(point.1)) is near the origin.")
  7. default:
  8.         print("The point is at (\(point.0), \(point.1)).")
  9. }
  10. // prints "(1, 2) is near the origin."


カスタム式の一致する動作を提供するために ~= 演算子をオーバーロードできます。たとえば、point の文字列表現で、point 式を比較するために上記の例を書き換えることができます。


  1. // Overload the ~= operator to match a string with an integer
  2. func ~=(pattern: String, value: Int) -> Bool {
  3.         return pattern == "\(value)"
  4. }
  5. switch point {
  6. case ("0", "0"):
  7.         print("(0, 0) is at the origin.")
  8. default:
  9.         print("The point is at (\(point.0), \(point.1)).")
  10. }
  11. // prints "The point is at (1, 2)."


式のパターンの文法

expression-patternexpression





前:属性 次:汎用パラメータと引数
目次
Xcode 9 の新機能

目次
Xcode 9 の新機能

Swift:はじめに
Swift と Cocoa と Objective-C
Swift Blog より

  • ようこそ Swift へ(Part I)
  • Swift について
  • バージョン互換性
  • Swift のツアー
  • 単純な値
    制御フロー
    関数とクロージャ
    オブジェクトとクラス
    列挙型と構造体
    プロトコルと拡張機能
    エラー処理
    汎用(ジェネリック)
  • Swift 言語のガイド(Part II)
  • Swift の基本
  • 定数と変数
  • 定数と変数の宣言
    型注釈
    定数と変数の命名
    定数と変数の印刷
    コメント
    セミコロン
  • 整数
  • 整数の境界
    Int
    UInt
    浮動小数点数
    安全な型と型推論
    数値リテラル
  • 数値型変換
  • 整数変換
    整数と浮動小数点間の変換
    型エイリアス
    ブール型
    タプル
  • Optional
  • nil
    if 文と強制開封
    Optional の結合
    暗黙に開封された Optionals
    エラー処理
  • アサーション(断言)と前提条件
  • アサーションを使用したデバッグ
    前提条件の実施
  • 基本演算子
  • 専門用語
    代入演算子
  • 算術演算子
  • 剰余演算子
    単項マイナス演算子
    単項プラス演算子
    複合代入演算子
    比較演算子
    三項条件演算子
    Nil 合体演算子
  • 範囲演算子
  • 閉鎖範囲演算子
    半開放範囲演算子
    片方の範囲
  • 論理演算子
  • 論理 NOT 演算子
    論理 AND 演算子
    論理 OR 演算子
    論理演算子の組み合わせ
    明示的な括弧
  • 文字列と文字
  • 文字列リテラル
    複数行の文字列リテラル
    文字列リテラル内の特殊文字
    空の文字列の初期化
    文字列の可変性
    文字列は値の型
    文字を使った作業
    文字列と文字を連結
    文字列補間
  • ユニコード(Unicode)
  • Unicode スカラー
    文字列リテラルの中の特別の文字
    拡張書記クラスタ
    文字を数える
  • 文字列のアクセスと変更
  • 文字列のインデックス
    部分文字列
    挿入と削除
  • 文字列の比較
  • 文字列と文字の等価性
    接頭辞と接尾辞の等価性
  • 文字列の Unicode 表現
  • UTF-8 の表現
    UTF-16 表現
    Unicode のスカラー表現
  • コレクション型
  • コレクションの可変性
  • 配列
  • 配列型省略構文
    空の配列の作成
    デフォルト値を持つ配列の作成
    2つの配列を共にして一つの配列に
    配列リテラルでの配列の作成
    配列へのアクセスと変更
    配列の繰り返し処理
  • セット
  • セット型のハッシュ値
    セット型の構文
    空のセットの作成と初期化
    配列リテラルでセットの作成
    セットへのアクセスと変更
    セットを反復処理
  • セット操作の実行
  • 基本的なセットの操作
    セットの身分と等価性
  • Dictionary
  • Dictionary 型の省略型構文
    空の Dictionary を作成
    Dictionary リテラルで Dictionary の作成
    Dictionary のアクセスと変更
    Dictionary を繰り返し処理
  • フロー制御
  • For-In ループ
  • While ループ
  • While
    Repeat-While
  • 条件文
  • if 文
  • Switch
  • 暗黙の Fallthrough なし
    範囲の一致
    タプル(Tuples)
    値の結合
    Where
    複合した case
  • 制御転送文
  • Continue
  • Break
  • ループ文内の Break
    Switch 文内の Break
    Fallthrough
    ラベル付きの文
    早期終了
    API 利用可能性の確認
  • 関数
  • 関数の定義と呼び出し
  • 関数のパラメータと戻り値
  • パラメータなしの関数
    複数パラメータの関数
    戻り値なしの関数
    複数の戻り値を持つ関数
    optional のタプル型の戻り値
  • 関数引数のラベルとパラメータ名
  • 引数のラベルの指定
    引数ラベルの省略
    デフォルトのパラメータ値
    可変個引数のパラメータ
    In-Out パラメータ
  • 関数型
  • 関数型の使用
    パラメータ型としての関数型
    戻り値の型としての関数型
    入れ子になった関数
  • クロージャ
  • クロージャ式
  • ソートするメソッド
    クロージャ式の構文
    文脈から型を推論
    単一式クロージャからの暗黙的戻り値
    引数名の省略
    演算子メソッド
    後続クロージャ
    値のキャプチャ
    クロージャは参照型
    クロージャのエスケープ
    オートクロージャ
  • 列挙型
  • 列挙型の構文
    switch 文で列挙型の値の一致
    関連する値
  • 生の値
  • 暗黙に割り当てられた生の値
    生の値からの初期化
    再帰的な列挙型
  • クラスと構造体
  • クラスと構造体を比較
  • 定義の構文
    クラスと構造体のインスタンス
    プロパティにアクセス
    構造体型のためのメンバー化イニシャライザ
    構造体と列挙型は値型
  • クラスは参照型
  • ID 演算子
    ポインタ
    クラスと構造体の間の選択
    文字列、配列、辞書の代入とコピーの動作
  • プロパティ
  • 格納されたプロパティ
  • 定数構造体インスタンスの格納されたプロパティ
    遅延した格納されたプロパティ
    格納されたプロパティとインスタンス変数
  • 計算されたプロパティ
  • セッタ宣言の省略形
    読み取り専用の計算されたプロパティ
    プロパティ監視者
    グローバルとローカル変数
  • 型プロパティ
  • 型プロパティの構文
    型プロパティの照会と設定
  • メソッド
  • インスタンスメソッド
  • self プロパティ
    インスタンスメソッド内から値の型を変更
    変異メソッド内で self に代入
    型メソッド
  • サブスクリプト
  • サブスクリプトの構文
    サブスクリプトの使用法
    サブスクリプトのオプション
  • 継承
  • 基本クラスの定義
    サブクラス化
  • オーバーライド(上書き)
  • スーパークラスメソッド、プロパティ、サブスクリプトへのアクセス
    オーバーライドするメソッド
  • オーバーライドするプロパティ
  • プロパティのゲッタとセッタのオーバーライド
    プロパティ監視者のオーバーライド
    オーバーライドの防止
  • 初期化
  • 格納されたプロパティの初期値を設定
  • イニシャライザ
    デフォルトのプロパティ値
  • 初期化のカスタマイズ
  • 初期化パラメータ
    パラメータ名と引数ラベル
    引数ラベルのないイニシャライザのパラメータ
    Optional のプロパティ型
    初期化中に定数プロパティへの代入
  • デフォルトのイニシャライザ
  • 構造体型のためのメンバ化イニシャライザ
    値型のイニシャライザデリゲート
  • クラスの継承と初期化
  • 指定イニシャライザとコンビニエンスイニシャライザ
    指定とコンビニエンスイニシャライザの構文
    クラス型のイニシャライザデリゲート
    二相の初期化
    イニシャライザ継承とオーバーライド
    自動イニシャライザの継承
    実際の指定とコンビニエンスイニシャライザ
  • 失敗可能イニシャライザ
  • 生の値を持つ列挙型のための失敗可能イニシャライザ
    初期化失敗の伝播
    失敗可能イニシャライザのオーバーライド
    init! の失敗可能イニシャライザ
    必須イニシャライザ
    クロージャや関数でのデフォルトのプロパティ値設定
  • デイニシャライザ
  • デイニシャライザはどのように働くか
    作動中のデイニシャライザ
  • Optional の連鎖
  • 強制開封の代替としての Optional の連鎖
    Optional の連鎖のモデルクラスの定義
    Optional の連鎖を使用したプロパティへのアクセス
    Optional の連鎖を通じてメソッドを呼び出す
  • Optional の連鎖を通じてサブスクリプトへのアクセス
  • Optional 型のサブスクリプトにアクセス
    連鎖の複数レベルのリンク
    optional の戻り値を持つメソッドでの連鎖
  • エラー処理
  • エラーの表現と Throw
    エラーの処理
    throw 関数を使用したエラーの伝播
    Do-Catch を使用したエラー処理
    エラー をOptional の値に変換
    エラー伝播を無効に
    クリーンアップアクションの指定
  • 型キャスト
  • 型キャストのためのクラス階層の定義
    型のチェック
    ダウンキャスト
  • Any と AnyObjecgt 用の型キャスティング
  • ネストした型
  • 実際のネストした型
    ネストした型への参照
  • 拡張機能
  • 拡張機能の構文
    計算されたプロパティ
    イニシャライザ
  • メソッド
  • 変異インスタンスメソッド
    サブスクリプト
    ネストした型
  • プロトコル
  • プロトコルの構文
    プロパティの要件
    メソッドの要件
    変異メソッドの要件
  • イニシャライザの要件
  • プロトコルイニシャライザ要件のクラス実装
    失敗可能イニシャライザの要件
    型としてのプロトコル
    デリゲート
  • 拡張機能を持つプロトコル準拠の追加
  • 拡張機能を持つプロトコルの採用を宣言
    プロトコル型のコレクション
    プロトコルの継承
    クラス専用プロトコル
    プロトコルの構成
    プロトコル準拠の確認
    Optional のプロトコル要件
  • プロトコル拡張機能
  • デフォルトの実装の提供
    プロトコル拡張機能に制約を追加
  • ジェネリック(汎用)
  • 汎用が解決する問題
    汎用関数
    型パラメータ
    型パラメータの命名
    汎用の型
    汎用型の拡張
  • 型の制約
  • 型制約の構文
    実際の型の制約
  • 関連型
  • 実際の関連型
    既存の型を拡張して関連型を指定
    型注釈を使用して関連型を制約
    汎用の Where 句
    汎用の Where 句を含む拡張機能
    関連する型と汎用の Where 句
    汎用のサブスクリプト
  • 自動参照カウント
  • どのように ARC は働くか
    実際の ARC
    クラスインスタンス間の強い循環参照
  • クラスインスタンス間の強い循環参照の解決
  • 弱い参照
    所有されていない参照
    所有されていない参照と暗黙に開封された Optional のプロパティ
    クロージャの strong な循環参照
  • クロージャの strong な循環参照の解決
  • キャプチャリストの定義
    弱い参照と所有されていない参照
  • メモリの安全性
  • メモリへのアクセス競合の理解
    メモリアクセスの特徴
    In-Out パラメータへのアクセスの競合
    メソッド内の Self へのアクセスの競合
    プロパティへのアクセスの競合
  • アクセス制御
  • モジュールとソースファイル
  • アクセスレベル
  • アクセスレベルの全体的指針
    デフォルトのアクセスレベル
    ターゲット一つのアプリのアクセスレベル
    フレームワークのアクセスレベル
    ユニットテストのターゲット用のアクセスレベル
    アクセス制御の構文
  • カスタム型
  • タプル型
    関数型
  • 列挙型
  • 生の値と関連する値
    ネストした型
    サブクラス化
  • 定数、変数、プロパティ、およびサブスクリプト
  • ゲッタとセッタ
  • イニシャライザ
  • デフォルトのイニシャライザ
    構造体型用のデフォルトメンバ化イニシャライザ
  • プロトコル
  • プロトコルの継承
    プロトコルの準拠
  • 拡張機能
  • 拡張機能の private メンバ
    汎用
    型エイリアス
  • 高度な演算子
  • ビット単位演算子
  • ビット単位の NOT 演算子
    ビット単位の AND 演算子
    ビット単位の OR 演算子
    ビット単位の XOR 演算子
  • ビット単位の左と右シフト演算子
  • 符号なし整数のシフト動作
    符号付き整数のシフト動作
  • オーバーフロー演算子
  • 値オーバーフロー
    優先順位と結合性
  • 演算子メソッド
  • 接頭辞と接尾辞演算子
    複合代入演算子
    等価演算子
  • カスタム演算子
  • カスタム挿入辞演算子の優先順位
  • 言語のガイド(Part III)
  • 言語リファレンスについて
  • 文法の読み方
  • 語彙の構造
  • 空白とコメント
    識別子
    キーワードと句読点
  • リテラル
  • 整数リテラル
    浮動小数点リテラル
    文字列のリテラル
    演算子

  • 型注釈
    型識別子
    タプル型
    関数型
    エスケープしないクロージャの制限事項
    配列型
    辞書型
    Optional の型
    暗黙に開封された Optional の型
    プロトコル構成の型
    メタタイプ型
    型の継承句
    型の推測

  • 接頭辞式
    Try 演算子
  • 二項式
  • 代入演算子
    三項条件演算子
    型キャスト演算子
  • 一次式
  • リテラル式
    Self 式
    スーパークラス式
  • クロージャ式
  • キャプチャ・リスト
    暗黙のメンバ式
    括弧で囲まれた式
    タプル式
    ワイルドカード式
    キーパス式
    セレクタ式
    キーパス文字列式
  • 接尾辞の式
  • 関数呼び出し式
    イニシャライザ式
    明示的なメンバ式
    接尾辞の Self 式
    サブスクリプト 式
    強制値の式
    Optional の連鎖式

  • ループ文
  • For-In 文
    While 文
    Repeat-While 文
  • 分岐文
  • if 文
    Guard 文
  • switch 文
  • switch 文は、網羅的である必要あり
    実行が暗黙的に case を Fall Through しない
    ラベル付き文
  • 制御転送文
  • break 文
    continue 文
    fallthrough 文
    return 文
    throw 文
    defer 文
    do 文
  • コンパイラ制御文
  • 条件コンパイルブロック
    行制御文
    利用可能条件
  • 宣言
  • トップレベルのコード
    コードブロック
    Import 宣言
    ­定数の宣言
  • 変数の宣言
  • 格納された変数と格納された変数のプロパティ
    計算された変数と計算されたプロパティ
    格納された変数監視者とプロパティの監視者
    型変数プロパティ
    型エイリアス宣言
  • 関数の宣言
  • パラメータ名
    In-Out パラメータ
    パラメータの特殊な種類
    メソッドの特殊な種類
    Throw する関数とメソッド
    Rethrow する関数とメソッド
    決して返さない関数
  • 列挙型の宣言
  • 任意の型の case を列挙
  • 間接による列挙
    生の値型の case を列挙
    列挙型 case へのアクセス
    構造体の宣言
    クラスの宣言
  • プロトコルの宣言
  • プロトコル・プロパティ宣言
    プロトコル・メソッド宣言
    プロトコル・イニシャライザ宣言
    プロトコル・サブスクリプト宣言
    プロトコルに関連した型の宣言
  • イニシャライザ宣言
  • 失敗可能イニシャライザ
    デイニシャライザ宣言
    拡張機能の宣言
    サブスクリプト宣言
    演算子の宣言
    優先順位グループ宣言
  • 宣言修飾子
  • アクセス制御レベル
  • 属性
  • 宣言の属性
  • インターフェイスビルダーで使われる宣言属性
    型の属性
  • パターン
  • ワイルドカードパターン
    識別子パターン
    値結合パターン
    タプルパターン
    列挙型 case パターン
    Optional のパターン
    型キャストパターン
    式のパターン
  • 汎用パラメータと引数
  • 汎用パラメータ句
  • 汎用の where 句
    汎用引数句
  • 文法のまとめ
  • 語彙の構造



    宣言
    属性
    パターン
    汎用パラメータと引数
  • マニュアルの変更履歴
  • 変更履歴