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)
}
}
このアプローチ私はの使用を避けるために、多くのコードを書いているので、私はどちらか好きではありません「!」強制アンラップオプションキャスト
これを行うための適切でスウィフトなエレガントな方法は何でしょうか?
指定された識別子を持つセルが指定されたクラスを返すことが常にわかっている場合、強制的にダウンキャストすることは安全です。 – JAL
@ JALの答えに追加するには、その強制アンラップが失敗した場合にプログラマーエラーが発生したときにすぐに通知されます。間違いを犯してテーブルにセルを登録する必要があることがわかります。ユーザーがこれまでに引き起こすことができるエラーではないので、この状況ではアンラップ力は問題ありません。 – keithbhunter
あなたのコードには2つの失敗点があります:(1)デキューする識別子が 'dogViewCellReuseIdentifier'のセルがありません。 (2)細胞が「DogViewCell」にキャスティングできない。最適な解決策は、あなたがこれらの障害点についてどれほど確実であるかによって異なります。強制的にダウンキャストすることは決してOKです –