2016-09-23 2 views
0

dequeueReusableCellWithIdentifierを呼び出すときに、そのサブクラスにUITableViewCellをキャストしようとしています。これは今私がやっていることです:UITableViewCellをそのサブクラスにキャストするうわさの方法は何ですか?

しかし、このアプローチでは、醜い強制キャストを使用しています。だから私は、よりSwiftyである代わりに、このアプローチを思い付いた:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let dogs = DBManager.getAllDogs() 
    let dog = dogs[indexPath.row] 

    if let cell = tableView.dequeueReusableCellWithIdentifier(Constants.dogViewCellReuseIdentifier, 
                   forIndexPath: indexPath) as? DogViewCell { 

     cell.configureWithDog(dog) 
     return cell 
    } else { 
     return tableView.dequeueReusableCellWithIdentifier(Constants.dogViewCellReuseIdentifier, 
                  forIndexPath: indexPath) 
    } 

} 

このアプローチ私はの使用を避けるために、多くのコードを書いているので、私はどちらか好きではありません「!」強制アンラップオプションキャスト

これを行うための適切でスウィフトなエレガントな方法は何でしょうか?

+4

指定された識別子を持つセルが指定されたクラスを返すことが常にわかっている場合、強制的にダウンキャストすることは安全です。 – JAL

+2

@ JALの答えに追加するには、その強制アンラップが失敗した場合にプログラマーエラーが発生したときにすぐに通知されます。間違いを犯してテーブルにセルを登録する必要があることがわかります。ユーザーがこれまでに引き起こすことができるエラーではないので、この状況ではアンラップ力は問題ありません。 – keithbhunter

+1

あなたのコードには2つの失敗点があります:(1)デキューする識別子が 'dogViewCellReuseIdentifier'のセルがありません。 (2)細胞が「DogViewCell」にキャスティングできない。最適な解決策は、あなたがこれらの障害点についてどれほど確実であるかによって異なります。強制的にダウンキャストすることは決してOKです –

答えて

1

開発中にクラッシュしたり、問題がどこにあるのかを伝える正確な行に、少し奇妙に見えますが、なぜ分かりにくいのか分かりません。

あなたの質問の状況では、セルまたはストーリーボードを間違って設定した場合にのみクラッシュすることになります。これはユーザーやWebサービスがあなたのために台無しになることではありません。

!!を使用して、いくつかのテストを実施して、構成を台無しにしていないことを知ってください。ねじれたときの開発中のクラッシュは、が役に立ちましたです。

関連する問題