                 cell.removeFromSuperview()
         })
     }
-}
-
-private struct SPCache: CustomStringConvertible {
     
-    private var cache: NSCache = NSCache()
-    
-    mutating func cacheView(view: UIView, atIndexPath indexPath: NSIndexPath) {
-        if let _ = cache.objectForKey(indexPath.stringKey) {
-            return
-        }
-        cache.setObject(view, forKey: indexPath.stringKey)
+    // MARK: Cache and Recycle
+    private func setUpCache() {
+        guard let _dataSource = dataSource else { return }
+        let count = _dataSource.numberOfVisibleCellsInTinderView(self)
+        print("\(count)")
     }
     
-    mutating func removeCachedViewAtIndexPath(atIndexPath indexPath: NSIndexPath) {
-        cache.removeObjectForKey(indexPath.stringKey)
+    private func recycleCell(cell: SPTinderViewCell) {
+        
     }
     
-    func cachedView(atIndexPath indexPath: NSIndexPath) -> UIView? {
-        return cache.objectForKey(indexPath.stringKey) as? UIView
+    public func registerNib(nib: UINib?, forCellReuseIdentifier identifier: String) {
+        guard let _nib = nib else { return }
+        if let cell = _nib.instantiateWithOwner(self, options: nil).first as? SPTinderViewCell {
+            cache.setObject(cell, forKey: identifier)
+        }
     }
     
-    var description: String {
-        return "PGViewCache- \(cache.name)"
+    public func registerClass(cellClass: AnyClass?, forCellReuseIdentifier identifier: String) {
+        if let cell = cellClass where cell is SPTinderViewCell.Type {
+            cache.setObject(cell, forKey: identifier)
+        }
+    }
+    
+    public func dequeueReusableCellWithIdentifier(identifier: String) -> SPTinderViewCell? {
+        return cache.objectForKey(identifier) as? SPTinderViewCell
     }
 }
-
-extension NSIndexPath {
-    private var stringKey: String {
-        return String("\(self.section)-\(self.row)")
-    }
-}

        
    }
    
    public func registerNib(nib: UINib?, forCellReuseIdentifier identifier: String) {
        guard let _nib = nib else { return }
        if let cell = _nib.instantiateWithOwner(self, options: nil).first as? SPTinderViewCell {
            cache.setObject(cell, forKey: identifier)
        }
    }

    public func registerClass(cellClass: AnyClass?, forCellReuseIdentifier identifier: String) {
        if let cell = cellClass where cell is SPTinderViewCell.Type {
            cache.setObject(cell, forKey: identifier)
        }
    }
    
    public func dequeueReusableCellWithIdentifier(identifier: String) -> SPTinderViewCell? {
        return cache.objectForKey(identifier) as? SPTinderViewCell
    }
    
    private func setUpFirstSetOfCells() {
        guard let dataSource_ = dataSource else { return }
        let count = dataSource_.numberOfItemsInTinderView(self)
        let visibleCount = dataSource_.numberOfVisibleCellsInTinderView(self)
        for var index = currentIndex; index < min(visibleCount, count - index); index++ {
            if let cell = dataSource_.tinderView(self, cellAtIndex: index) {
                self.insertSubview(cell, atIndex: 0)
                cell.center = positionForCellAtIndex(index)
            }

    // Cache
    private var cache: NSCache = NSCache()
    
    var dataSource: SPTinderViewDataSource? {
        didSet {
            
        }
    }
    
    var delegate: SPTinderViewDelegate?
    var currentIndex: Int = 0
    
