     func startRefreshing()
 }
 
-class Refresher: NSObject {
+final class Refresher: NSObject {
 
-    private var refreshView: UIView!
+    private let refreshView: UIView
 
-    private var scrollView: UIScrollView!
+    private let scrollView: UIScrollView
 
-    weak var delegate: RefresherDelegate?
+    public weak var delegate: RefresherDelegate?
 
     private(set) var state: RefreshState = .Normal {
         didSet (oldValue) {

        }
    }

    var animateDuration: TimeInterval = 0.3

    private var isDragging = false

    init(refreshView: UIView, scrollView: UIScrollView) {
        super.init()
        refreshView.frame = CGRect(x: 0, y: -refreshView.frame.height, width: scrollView.frame.width, height: refreshView.frame.height)
        scrollView.addSubview(refreshView)
        self.refreshView = refreshView
        self.scrollView = scrollView

        scrollView.addObserver(self, forKeyPath: "contentOffset", options: [.new], context: nil)
    }


        }
    }

    public func finishRefreshing() {
        // End Refreshing
        state = .Normal
        UIView.animate(withDuration: animateDuration) {
