入力検証結果によるセグウェイの実行

ここでは「画面の遷移 (モーダル表示) と画面間のデータ受渡し」で行った入力検証と、 その結果によってセグウェイ (segue) の実行を制御することについて、少し細かくみてみましょう。

segue は日本ではカタカナで「セグエ」と書かれることが多いようですが、少なくともアメリカでは「セグウェイ」という発音の方が近いので、 当サイトではセグウェイとして書きます。

画面の遷移 (モーダル表示) と画面間のデータ受渡し」では、 次のビデオのように、テキストフィールドに入力した文字を新しく表示する画面に表示する、ということをやりました。

このとき、テキストフィールドに何も入力していない場合もしくは、空白文字しか入力していないときは、 次の画面に遷移しないようにしています。

このような制御は shouldPerformSegue(withIdentifier:sender:) メソッドで行います。

このメソッドで false を返すと、セグウェイの実行が行われません。

よって、ここでは segue の識別子が所定のものである場合、テキストフィールドの文字を取り出し、それが nil や空白でない場合に true を返し、それ以外の場合は false を返しています。

override func shouldPerformSegue(
    withIdentifier identifier: String,
    sender: Any?) -> Bool {

    if identifier == "showView2" {
        if let text = textField.text,
            !text.trimmingCharacters(in: .whitespaces).isEmpty {
            return true
        }
    }

    return false
}

このコードを少し細かくみてみましょう。

テキストフィールドの値の評価。まずはアンラップ

まず、if let text = textField.text の部分です。

if identifier == "showView2" {
    if let text = textField.text,
        !text.trimmingCharacters(in: .whitespaces).isEmpty {
        return true
    }
}

return false

UITextField の text プロパティはオプショナルの String 型です。すなわち String? 型です。これは「値を持つなら String 型だけど、nil の場合もある」という型です。

このようなオプショナルの値を使うときは、Swift ではアンラップが必要です。それをしないと、コンパイルでエラーになります。

アンラップ、という言葉は、「包んでいたものを中から取り出す」というような意味です。nil になるかもしれないデータを、丁寧に取り出す感じで考えましょう。

もし、textField.text が nil である場合、この時点で if ブロックに入らないことが決まるので、false が返ります。 変数 text に nil でない String データが取れた場合は、次のコードが実行されます。

if identifier == "showView2" {
    if let text = textField.text,
        !text.trimmingCharacters(in: .whitespaces).isEmpty {
        return true
    }
}

String の trimmingCharacters(in:) メソッドに、.whitespaces を渡すと前後の空白文字が削除されます。ただし、改行文字はトリムされません。 改行も含める場合は .whitespacesAndNewlines を渡します。

トリム後に isEmpty プロパティを評価して、false であれば、shouldPerformSegue メソッドで true を返します。それ以外は false とします。

これによって、セグウェイの実行を制御することができます。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Swift による iOS 開発入門