2017-02-01 16 views
1

私は抽象クラスをエミュレートする最も良い方法であるプロトコルとプロトコル拡張について知っていますが、私がやりたいことは実際の抽象クラスを必要とします。Swiftの抽象クラス

私はBaseCollectionViewCellBaseCollectionViewSourceが一緒に働きたいです。 BaseCollectionViewSourceのサブクラスに配列を渡し、再利用識別子を返すメソッドを実装します。セルはBaseCollectionViewSourceによってインスタンス化され、コンクリートcollectionViewCellでオーバーライドされるメソッドsetDataがあります。私は実質的に何をしたいのか

はこれです:

abstract class WRBaseCollectionViewCell: UICollectionViewCell { 
    abstract func setData(_ data: AnyObject) 
} 

しかし、私はスウィフト(と思う)でこれをエミュレートすることはできません。プロトコルはクラスから継承することはできません。動的ディスパッチはありません。これにより、すべてが上書き可能であるという私の考えが破棄されます。

これを行う方法を知っている人はいますか?おそらく工場?私はこれを新しいcollectionViewを実装するためにできるだけ簡単にしたいと思います。

+0

Swiftには抽象クラスがありません。 IMOには必要ありません。ジェネリックスとプロトコル、特に*プロトコル拡張*を使用すると、迅速なツールセットが提供されます。 – vikingosegundo

+0

@vikingosegundoあなたは私の問題に具体的な解決策を持っていますか?言語を変更するよう求めているわけではありません。可能な限り最適に実装したいと思います。 – vrwim

+0

あなたの特定の例のために:私は最近開始したプロジェクトを見ているかもしれません:[TaCoPopulator](https://github.com/vikingosegundo/TaCoPopulator)、コレクションとテーブルビューのためのデータソースフレームワーク。 – vikingosegundo

答えて

1

うーん、あなたが何を望んでいるかわからない。以下のプロトコルを見てください。

protocol SetDataViewCell {} 

extension SetDataViewCell where Self: UICollectionViewCell { 
    func setData(_ data: AnyObject) {} 
} 
4

参考のため、現在はadd Abstract classes/methodsに提案がありますが、現在のところ異なります。私は彼らが来年にそれを再検討するだろうと推測しています。

私は事のこのタイプを達成する方法は、関連する種類のプロトコルを使用することです:

protocol ViewModelUpdatable { 
    associatedtype ViewModelType 
    func update(with viewModel: ViewModelType) 
} 

その後、単にあなたのクラスがそれに付着させる、それは追加するように強制します:

func update(with viewModel: WhateverTypeYouWant) { 
    //update your class 
} 

このアプローチの利点は、より一般的な方法でクラスを処理できますが、型の安全性を保つことです。

私はこの日に対処したいと思っている方法はジェネリックですが、InterfaceBuilderはまだジェネリックで壊れています。