     
     switch (lhs.type, rhs.type) {
     case (.Number, .Number):
-        return (lhs.object as! NSNumber) > (rhs.object as! NSNumber)
+        return lhs.rawNumber > rhs.rawNumber
     case (.String, .String):
-        return (lhs.object as! String) > (rhs.object as! String)
+        return lhs.rawString > rhs.rawString
     default:
         return false
     }

    
    switch (lhs.type, rhs.type) {
    case (.Number, .Number):
        return (lhs.object as! NSNumber) < (rhs.object as! NSNumber)
    case (.String, .String):
        return (lhs.object as! String) < (rhs.object as! String)
    default:
        return false
    }

    
    switch (lhs.type, rhs.type) {
    case (.Number, .Number):
        return lhs.rawNumber <= rhs.rawNumber
    case (.String, .String):
        return lhs.rawString <= rhs.rawString
    case (.Bool, .Bool):
        return lhs.rawNumber.boolValue == rhs.rawNumber.boolValue
    case (.Array, .Array):
        return lhs.rawArray as NSArray == rhs.rawArray as NSArray
    case (.Dictionary, .Dictionary):
        return lhs.rawDictionary as NSDictionary == rhs.rawDictionary as NSDictionary
    case (.Null, .Null):
        return true
    default:
