を使用するかもしれないわずかなチャンスをtheresの場合、あなたはそれ以外のキャストを強制することができますになります正確に何を知っている場合は、このパターンは、完全に有効です。要約すると
安全で便利な、時には:
:
Song
または
Movie
オブジェクト(メディアの両方のサブクラス)のどちらかを含めることができ
Media
インスタンスの配列、:
if myObject is String {
let myString = myObject as! String
}
は、Appleによって与えられた例を考えてみましょう
let mediaArray = [Media]()
// (populate...)
for media in mediaArray {
if media is Song {
let song = media as! Song
// use Song class's methods and properties on song...
}
else if media is Movie {
let movie = media as! Movie
// use Movie class's methods and properties on movie...
}
EDIT:しばらくSwiftlintを使用した後、私は今(以下ケビンさんのコメント@に沿って)ゼロフォース・アンラッピングカルトへの総変換しています。 、
for media in mediaArray {
if let song = media as? Song {
// use Song class's methods and properties on song...
} else if let movie = media as? Movie {
// use Movie class's methods and properties on movie...
}
}
...以上をは、それぞれのタイプの[Song]
と[Movie]
の配列をタイプ2(空)にmediaArray
をオンにするflatMap()
を使用します。
だから、今日では私はこれを行うだろう。しかし、それは問題の範囲外です(force-unwrap)...
さらに、テーブルビューのセルをデキューしても、強制解除しません。デキューされたセルを適切なUITableViewCell
サブクラスにキャストできない場合は、ストーリーボードに何か問題があることを意味します。したがって、復旧できる実行時条件ではありません(むしろ、検出と修正が必要な開発時エラー)私はfatalError()
と結婚します。
を私が使用して言うと思います力アンラッピングは許容可能です。あなたがしていることを知っている限り。しかし、あなたの特定の状況では、オプションのアンラッピングを使う方が良いでしょう。 'dequeueReusableCellWithReuseIdentifier'によって返されたセルが' MyOffersViewCell'の型かどうかを調べることができます。もしそうなら、あなたが望むものを何でもしてください。そうでなければ 'UITableViewCell'を返してください。問題はありません。 –