2016-03-20 15 views
1

Varsayalım UICollectionViewCell ve aynı özelliklere sahip bir UITableViewCell var. Bu hücreleri dolduran iki işlevden ziyade, bir şey alan bir jenerik alabilir miyim, ne olduğunu belirledikten sonra geri dönmeden önce eylemleri gerçekleştirmek için doğru şeye mi çevirebilirim?Genel bir hızlı işlevde tür dökümleme

benim düşünce geçerli:

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

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

} 

bu kod tekrarına büyük miktarda kaçınmanın iyi bir yoldur?

+0

Daha fazla bilgi gerekli, hangi sınıf foo? SeperatorInset', 'event',' bar' özelliklerinde nerede bulunuyorsunuz? Örneğini genişletmelisin. – ColGraff

+1

Foo nedir? Aynı işlemleri iki farklı türde gerçekleştirmek istiyorsanız, bazı arayüzleri paylaşmak zorundadırlar, örn. Aynı protokolü benimsemek, aynı süper sınıfın alt sınıfları vb. – Sulthan

+0

foo, sadece bir örnek, sahip olduğum şey, UITableViewCell ve UICollectionViewCell alt sınıflarıyla aynı özelliklere sahip ve aynı şekilde çok fazla ayarlanması gerekiyor. Ben iki ayrı fonksiyon yazabilirim ama generiklerin bunu yapmanın başka bir yolu olabileceğini düşündüm – Md1079

cevap

2

Bu, düşündüğünüzle eşleşiyor mu?

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

Bu da iyi görünüyor, farzederek ViewCellAdditions işlevini displayView olarak adlandırmak istedim.) Bu hücreler için erişim gerekli Görünüm, ben hala bu setUpCell normal – Md1079

+0

olarak diyebilirim varsayalım Bunu yapamazsınız çünkü UIView bir özellik değil, bir sınıftır. Bunun yerine yapacağınız şey ya UIView'in mülkiyete uygun hale getirilmesi ya da UIView'den yeni mülkün yeni mülküne sahip olması. İkincisi muhtemelen en iyisidir. – ColGraff

2

Şimdi bu uzantıyı

o

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

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

için UITabelViewCell ve UICollectionViewCell uygun Ve nihayet tanımlamak bu protokolü

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

tanımlamak için model tipi

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

Verilen

extension EventCell { 
    func populate(event:Event) { 
     self.id = event.id 
     self.desc = event.desc 
    } 
} 

İşte bu kadar. Artık her iki hücreniz de (UITabelViewCell ve UICollectionViewCell) populate yöntemine sahip!

+0

Bunu denemek istediğim güzel görünüyor, birkaç tane var Görünümün nüfuz eden hücreler üzerindeki işlevleri görüntülemek için EVentCell'in bu işlemlerin erişiminin ayrı ayrı ilgili sınıflarında saklanması gerekeceği gibi ayrı ayrı sınıflarında tutulması gerektiğini düşünürüm – Md1079

İlgili konular