1. ホーム
  2. for-loop

[解決済み] フォーインループの型鋳造

2022-07-17 10:09:52

質問

このようなfor-inループがあります。

for button in view.subviews {
}

今度は、ボタンをカスタムクラスにキャストして、そのプロパティを使用できるようにしたい。

私はこれを試してみました。 for button in view.subviews as AClass

しかし、それは動作しませんし、私にエラーを与える。 'AClass' does not conform to protocol 'SequenceType'

そして、私はこれを試してみました。 for button:AClass in view.subviews

しかし、どちらもうまくいきません。

どのように解決するのですか?

以下のような場合 Swift 2 以降のバージョンでは

Swift 2 では ケースパターン に対して ループを使用することで、さらに簡単かつ安全にキャストをタイプすることができます。 for ループの中でキャストを入力するのがより簡単で安全になります。

for case let button as AClass in view.subviews {
    // do something with button
}

でできることよりも、なぜこの方が良いのでしょうか? Swift 1.2 およびそれ以前よりも優れているのでしょうか? それは ケースパターン を使うと、コレクションの中から特定の型を選ぶことができます。 探している型にしかマッチしないので、配列に混在している場合、特定の型にのみ操作することができます。

例えば

let array: [Any] = [1, 1.2, "Hello", true, [1, 2, 3], "World!"]
for case let str as String in array {
    print(str)
}

出力します。

Hello
World!


について Swift 1.2 :

この場合、キャストしている view.subviews であって button でないので、必要な型の配列にダウンキャストする必要があります。

for button in view.subviews as! [AClass] {
    // do something with button
}

注意:もし基礎となる配列の型が [AClass] でない場合、これはクラッシュします。 これは ! にある as! はあなたに伝えています。 もし型について確信が持てない場合は、条件付きキャストの as? というオプションのバインディングと共に if let :

if let subviews = view.subviews as? [AClass] {
    // If we get here, then subviews is of type [AClass]
    for button in subviews {
        // do something with button
    }
}

について Swift 1.1 およびそれ以前のバージョンでは

for button in view.subviews as [AClass] {
    // do something with button
}

注意: これは、サブビューがすべて AClass . 上記の安全な方法は、Swiftの以前のバージョンでも動作します。