             }
         }
         
-        return (Double(Int(characteristic)!) +
+        let doubleCharacteristic = Double(Int(characteristic)!)
+        return (doubleCharacteristic +
             Double(Int(mantissa)!) / pow(Double(10), Double(mantissa.characters.count - 1))) *
             (isNegative ? -1 : 1)
     }
     
+    #if swift(>=3.0)
     /**
      * Splits a string into an array of string components.
      *
-     * - parameter splitBy:  The character to split on.
-     * - parameter maxSplit: The maximum number of splits to perform. If 0, all possible splits are made.
+     * - parameter by:        The character to split on.
+     * - parameter maxSplits: The maximum number of splits to perform. If 0, all possible splits are made.
      *
      * - returns: An array of string components.
      */
-    func splitByCharacter(splitBy: Character, maxSplits: Int = 0) -> [String] {
+    func split(by: Character, maxSplits: Int = 0) -> [String] {
         var s = [String]()
         var numSplits = 0
         
         var curIdx = self.startIndex
         for i in self.characters.indices {
             let c = self[i]
-            if c == splitBy && (maxSplits == 0 || numSplits < maxSplits) {
+            if c == by && (maxSplits == 0 || numSplits < maxSplits) {
+                s.append(self[curIdx..<i])
+                curIdx = self.index(after: i)
+                numSplits += 1
+            }
+        }
+        
+        if curIdx != self.endIndex {
+            s.append(self[curIdx..<self.endIndex])
+        }
+        
+        return s
+    }
+    
+    #else
+    
+    /**
+     * Splits a string into an array of string components.
+     *
+     * - parameter by:        The character to split on.
+     * - parameter maxSplits: The maximum number of splits to perform. If 0, all possible splits are made.
+     *
+     * - returns: An array of string components.
+     */
+    func split(by by: Character, maxSplits: Int = 0) -> [String] {
+        var s = [String]()
+        var numSplits = 0
+        
+        var curIdx = self.startIndex
+        for i in self.characters.indices {
+            let c = self[i]
+            if c == by && (maxSplits == 0 || numSplits < maxSplits) {
                 s.append(self[curIdx..<i])
                 curIdx = i.successor()
                 numSplits += 1

            }
            
            /* Remove attached argument from flag */
            let splitFlag = flagWithArg.splitByCharacter(ArgumentAttacher, maxSplits: 1)
            let flag = splitFlag[0]
            let attachedArg: String? = splitFlag.count == 2 ? splitFlag[1] : nil
            

     * File type is pdf, files are ["~/file1.pdf", "~/file2.pdf"]
     * ```
     */
    public private(set) var unparsedArguments: [String] = [String]()
    
    /**
     * If supplied, this function will be called when printing usage messages.
