2016-03-20 8 views
1

同じプロパティを持つUICollectionViewCellとUITableViewCellがあるとします。それらの細胞を移植する2つの機能を持っているのではなく、何かを取り、それが何であるのかを判断し、それを正しいものにキャストして戻ってくる前に行動を起こすジェネリックを持つことができますか?汎用スウィフト関数での型キャスト

私の考えは次のようになります。これはコードの重複を大量に回避する良い方法

func setUpCell<T>(event: Event, cell:T) -> T { 

    // figure out what T is and cast it 
    cell.event.bar = event.bar 
    return cell 

} 

のですか?お使いのモデル・タイプを考えると

+0

さらに詳しい情報が必要ですが、どのクラスがfooですか? 'seperatorInset'、' event'、 'bar'というプロパティはどこで定義されていますか?あなたの例を拡張する必要があります。 – ColGraff

+1

'foo'とは何ですか? 2つの異なるタイプで同じ操作を実行する場合は、インターフェイスをいくつか共有する必要があります。同一のプロトコルを採用する、同じスーパークラスのサブクラスなのです。 – Sulthan

+0

fooは何もありません。その単なる例ですが、私はUITableViewCellとUICollectionViewCellのサブクラスが同じプロパティを持ち、同じように多く設定する必要があります。私は2つの別々の関数を書くことができたが、ジェネリックはそれを行うための他の方法かもしれないと思った。 – Md1079

答えて

2

これはあなたが考えていたものと一致しますか?

import UIKit 

struct Event { 
    var bar:Int = 0 
} 

// Protocol to group common additions 
protocol ViewCellAdditions { 
    init() 
    var separatorInset:Int { get set } 
    var event:Event { get set} 
} 

// Generic function to work on any class that adopts ViewCellAdditions 
func setUpCell<T: ViewCellAdditions>(event: Event, cell:T, foo:Int) -> T { 
    var newCell = T() 
    newCell.separatorInset = foo 
    newCell.event.bar = event.bar 
    return newCell 
} 

// Class that adopts ViewCellAdditions 
class NewCellClass: ViewCellAdditions { 
    required init() {} 
    var separatorInset:Int = 10 
    var event:Event = Event() 
} 

// How to use it 
let aCell = NewCellClass() 
let aEvent = Event() 
let newCell = setUpCell(aEvent, cell: aCell, foo: 5) 
+0

ViewCellAdditions上でdisplayViewという関数を設定したいとします)、私はまだsetUpCellから通常これを呼び出すことができると仮定します。 – Md1079

+0

'UIView'はクラスでありプロパティではないので、これを行うことはできません。代わりに、UIViewをプロパティに合わせて拡張するか、新しいクラスがUIViewと新しいプロパティから継承するようにします。おそらく後者が最適です。 – ColGraff

2

struct Event { 
    let title: String 
    let desc: String 
} 

protocol EventCell: class { 
    var id: String? { get set } 
    var desc: String? { get set } 
} 

class TableCell: UITableViewController, EventCell { 
    var id: String? 
    var desc: String? 
} 

class CollectionCell: UICollectionViewCell, EventCell { 
    var id: String? 
    var desc: String? 
} 

それにあなたのUITabelViewCellUICollectionViewCellに準拠そして最後に

この拡張機能を定義し、このプロトコルを定義します
extension EventCell { 
    func populate(event:Event) { 
     self.id = event.id 
     self.desc = event.desc 
    } 
} 

これだけです。現在、両方のセル(UITabelViewCellUICollectionViewCell)にはpopulateのメソッドがあります。

+0

これはうまくいくようだが、 EVENTCellがビューへのアクセスを持たないように、ビューにデータを入れるセルの関数それぞれのクラスに保持する必要があると思います – Md1079

関連する問題