[AnyObject]? をループすると、ジェネレーターという名前のメンバーがなくなります。質問する

[AnyObject]? をループすると、ジェネレーターという名前のメンバーがなくなります。質問する

なぜ直接ループできないのですか[AnyObject]?? 名前付きジェネレータがないとはどういう意味ですか?[AnyObject]?型をループするための適切な手法は何ですか?

このコードでは、generator という名前のメンバーがないことを示すエラーが表示されます。

for screen in NSScreen.screens() {
        var result : Bool = workspace.setDesktopImageURL(imgurl, forScreen: screen, options: nil, error: &error)
}

ベストアンサー1

screensオプションを返すので、実際の値を使用する前にアンラップする必要があります。推奨される方法はオプション バインディングです。

if let screens = NSScreen.screens() {
    for screen in screens {
        var result : Bool = workspace.setDesktopImageURL(imgurl, forScreen: screen, options: nil, error: &error)
    }
}

詳細はこちらオプション

NSScreen.screensは を返すので、オプションのバインディングで配列を[AnyObject]?のようにキャストする必要があることに注意してください。[NSScreen]

if let screens = NSScreen.screens() as? [NSScreen] {
    for screen in screens {
        var result : Bool = workspace.setDesktopImageURL(imgurl, forScreen: screen, options: nil, error: &error)
    }
}

補遺コメントの質問への回答: エラーメッセージになぜ[AnyObject]? does not have a member named generator

オプションは、含まれる値とは異なる型です (オプションは実際には列挙型です)。配列を反復処理することはできますが、整数または列挙型を反復処理することはできません。

違いを理解するために、実際の例を挙げてみましょう。eBayで新しいテレビを購入し、パッケージが発送されたら、最初にパッケージ(オプション)が空(nil)であるかどうかを確認します。テレビが入っていることを確認したら、パッケージを開封し、箱を脇に置きます。パッケージに入ったままテレビを使用することはできません。同様に、オプションはコンテナです。ない含まれている値が同じ型ではありません。空の場合もあれば、有効な値が含まれている場合もあります。

おすすめ記事