   }
 }
 
-internal let kNoDataSourceInconsistency : StaticString = "Must have a data source"
-internal let kNoWrongNumberOfLayersInconsistency : StaticString = "Inconsistent number of layers"
+internal let kNoDataSourceInconsistency : String = "Must have a data source"
+internal let kNoWrongNumberOfLayersInconsistency : String = "Inconsistent number of layers"

  
  override func layoutSubviews() {
    super.layoutSubviews()
    assert(widthConstraint != nil, "Width constraint must be set")
    setupEndPoints()
    setupMidPoints()
    ticksLayer?.frame = bounds

  optional func hoveredOverDate(date:NSDate, index:Int, control:JCMTimeSliderControl)
}

/**
*  We use this shell class to let UIKit Dynamics to do the heavy lifting of the animation
*  for our selected tick
*/
class DynamicTick : NSObject, UIDynamicItem {
  var tick: CAShapeLayer
  var labels: [CATextLayer]
  var center: CGPoint {
    get {
      return CGPoint(x: tick.frame.midX, y: tick.frame.midY)
    }
    set {
      let w = tick.frame.width
      let h = tick.frame.height
      let xx = newValue.x - w/2.0
      let yy = newValue.y - h/2.0
      let newFrame = CGRect(x: xx, y: yy, width: w, height: h)
      tick.frame = newFrame
    }
  }
  var bounds: CGRect {
    get {
      return tick.bounds
    }
  }
  var transform: CGAffineTransform
  
  init(tick: CAShapeLayer, labels: [CATextLayer]) {
    self.tick = tick
    self.labels = labels
    self.transform = CGAffineTransformIdentity
    super.init()
  }
}

class JCMTimeSliderControl: UIControl, UIDynamicAnimatorDelegate, JCMTimeSliderControlDataSource {

  required init(coder aDecoder: NSCoder) {
    // Initialize our added elements
    expanded = false
    expansionChangeNeeded = false
    super.init(coder: aDecoder)
    clipsToBounds = true
    snapAnimUIDynamicAnimator = UIDynamicAnimator(referenceView: self)
