From 3e0acf4735edd646b81de884fabef657e365c332 Mon Sep 17 00:00:00 2001
From: Ferenc Kiss <idioty@freemail.hu>
Date: Sun, 24 Apr 2016 19:57:57 +0200
Subject: [PATCH 1/2] I need to access all UIBezierPath. Please merge with
 this.

---
 SwiftSVG/UIBezierPath+SVG.swift | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/SwiftSVG/UIBezierPath+SVG.swift b/SwiftSVG/UIBezierPath+SVG.swift
index 9851ff0..cac6c70 100644
--- a/SwiftSVG/UIBezierPath+SVG.swift
+++ b/SwiftSVG/UIBezierPath+SVG.swift
@@ -42,6 +42,10 @@ extension UIBezierPath {
     public class func pathWithSVGURL(SVGURL: NSURL) -> UIBezierPath? {
         let parser = SVGParser(SVGURL: SVGURL, containerLayer: nil, shouldParseSinglePathOnly: true)
         return parser.paths.first
-    }
-    
+	}
+
+	public class func pathsWithSVGURL(SVGURL: NSURL) -> [UIBezierPath] {
+		let parser = SVGParser(SVGURL: SVGURL, containerLayer: nil, shouldParseSinglePathOnly: true)
+		return parser.paths
+	}
 }
\ No newline at end of file

From 27c053812aa74b5e17e93579ac2f1eb6bec38e1e Mon Sep 17 00:00:00 2001
From: Ferenc Kiss <idioty@freemail.hu>
Date: Tue, 30 Aug 2016 12:01:43 +0200
Subject: [PATCH 2/2] =?UTF-8?q?Felfriss=C3=ADtve=20a=20k=C3=B3d=20Swift=20?=
 =?UTF-8?q?3.0-ra=20=C3=A9s=20iOS10-re.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 SwiftSVG.xcodeproj/project.pbxproj            |  16 ++-
 .../xcschemes/SwiftSVGMac.xcscheme            |   2 +-
 .../xcschemes/SwiftSVGiOS.xcscheme            |   2 +-
 SwiftSVG/CAShapeLayer+SVG.swift               |   4 +-
 SwiftSVG/Dictionary+KeyForValue.swift         |   4 +-
 SwiftSVG/NSObject+Extensions.swift            |   8 +-
 SwiftSVG/SVGParser.swift                      |  16 +--
 SwiftSVG/SVGView.swift                        |   4 +-
 SwiftSVG/Stack.swift                          |   4 +-
 SwiftSVG/String+SVG.swift                     | 130 +++++++++---------
 SwiftSVG/String+Subscript.swift               |   6 +-
 SwiftSVG/UIBezierPath+SVG.swift               |   8 +-
 SwiftSVG/UIColor+Extensions.swift             |   9 +-
 SwiftSVG/UIView+SVG.swift                     |   4 +-
 14 files changed, 117 insertions(+), 100 deletions(-)

diff --git a/SwiftSVG.xcodeproj/project.pbxproj b/SwiftSVG.xcodeproj/project.pbxproj
index 28cee9b..22bdb04 100644
--- a/SwiftSVG.xcodeproj/project.pbxproj
+++ b/SwiftSVG.xcodeproj/project.pbxproj
@@ -292,7 +292,7 @@
 			isa = PBXProject;
 			attributes = {
 				LastSwiftUpdateCheck = 0710;
-				LastUpgradeCheck = 0710;
+				LastUpgradeCheck = 0800;
 				ORGANIZATIONNAME = "Strauss LLC";
 				TargetAttributes = {
 					396A8E431B3D2036001986AF = {
@@ -303,6 +303,7 @@
 					};
 					39B8D88B1B3C3283009DAF60 = {
 						CreatedOnToolsVersion = 6.3.2;
+						LastSwiftMigration = 0800;
 					};
 				};
 			};
@@ -460,6 +461,7 @@
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SDKROOT = macosx;
 				SKIP_INSTALL = YES;
+				SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
 				VERSIONING_SYSTEM = "apple-generic";
 				VERSION_INFO_PREFIX = "";
 			};
@@ -505,12 +507,14 @@
 				PRODUCT_BUNDLE_IDENTIFIER = "com.sixpolys.$(PRODUCT_NAME:rfc1034identifier)";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SDKROOT = macosx;
+				SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
 			};
 			name = Release;
 		};
 		39B8D89F1B3C3284009DAF60 /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
 				CURRENT_PROJECT_VERSION = 1;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				DEFINES_MODULE = YES;
@@ -529,6 +533,7 @@
 				PRODUCT_BUNDLE_IDENTIFIER = "com.straussmade.$(PRODUCT_NAME:rfc1034identifier)";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SKIP_INSTALL = YES;
+				SWIFT_VERSION = 3.0;
 				TARGETED_DEVICE_FAMILY = "1,2";
 				VERSIONING_SYSTEM = "apple-generic";
 				VERSION_INFO_PREFIX = "";
@@ -538,6 +543,7 @@
 		39B8D8A01B3C3284009DAF60 /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
 				COPY_PHASE_STRIP = NO;
 				CURRENT_PROJECT_VERSION = 1;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
@@ -553,6 +559,8 @@
 				PRODUCT_BUNDLE_IDENTIFIER = "com.straussmade.$(PRODUCT_NAME:rfc1034identifier)";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SKIP_INSTALL = YES;
+				SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
+				SWIFT_VERSION = 3.0;
 				TARGETED_DEVICE_FAMILY = "1,2";
 				VERSIONING_SYSTEM = "apple-generic";
 				VERSION_INFO_PREFIX = "";
@@ -572,8 +580,10 @@
 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
 				CLANG_WARN_EMPTY_BODY = YES;
 				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
 				CLANG_WARN_INT_CONVERSION = YES;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@@ -582,6 +592,7 @@
 				ENABLE_TESTABILITY = YES;
 				GCC_C_LANGUAGE_STANDARD = gnu99;
 				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_NO_COMMON_BLOCKS = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
 				GCC_PREPROCESSOR_DEFINITIONS = (
 					"DEBUG=1",
@@ -615,8 +626,10 @@
 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
 				CLANG_WARN_EMPTY_BODY = YES;
 				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
 				CLANG_WARN_INT_CONVERSION = YES;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@@ -624,6 +637,7 @@
 				ENABLE_NS_ASSERTIONS = NO;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_NO_COMMON_BLOCKS = YES;
 				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
 				GCC_WARN_UNDECLARED_SELECTOR = YES;
diff --git a/SwiftSVG.xcodeproj/xcshareddata/xcschemes/SwiftSVGMac.xcscheme b/SwiftSVG.xcodeproj/xcshareddata/xcschemes/SwiftSVGMac.xcscheme
index 698a20e..2ad35c6 100644
--- a/SwiftSVG.xcodeproj/xcshareddata/xcschemes/SwiftSVGMac.xcscheme
+++ b/SwiftSVG.xcodeproj/xcshareddata/xcschemes/SwiftSVGMac.xcscheme
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "0710"
+   LastUpgradeVersion = "0800"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"
diff --git a/SwiftSVG.xcodeproj/xcshareddata/xcschemes/SwiftSVGiOS.xcscheme b/SwiftSVG.xcodeproj/xcshareddata/xcschemes/SwiftSVGiOS.xcscheme
index d7c16d4..22c914d 100644
--- a/SwiftSVG.xcodeproj/xcshareddata/xcschemes/SwiftSVGiOS.xcscheme
+++ b/SwiftSVG.xcodeproj/xcshareddata/xcschemes/SwiftSVGiOS.xcscheme
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "0710"
+   LastUpgradeVersion = "0800"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"
diff --git a/SwiftSVG/CAShapeLayer+SVG.swift b/SwiftSVG/CAShapeLayer+SVG.swift
index c909f4b..1364fda 100644
--- a/SwiftSVG/CAShapeLayer+SVG.swift
+++ b/SwiftSVG/CAShapeLayer+SVG.swift
@@ -37,10 +37,10 @@ extension CAShapeLayer {
     public convenience init(pathString: String) {
         self.init()
         let svgPath = UIBezierPath(pathString: pathString)
-        self.path = svgPath.CGPath
+        self.path = svgPath.cgPath
     }
     
-    public convenience init(SVGURL: NSURL) {
+    public convenience init(SVGURL: URL) {
         self.init()
         _ = SVGParser(SVGURL: SVGURL, containerLayer: self)
     }
diff --git a/SwiftSVG/Dictionary+KeyForValue.swift b/SwiftSVG/Dictionary+KeyForValue.swift
index a59f7e6..145e3e1 100644
--- a/SwiftSVG/Dictionary+KeyForValue.swift
+++ b/SwiftSVG/Dictionary+KeyForValue.swift
@@ -38,7 +38,7 @@
 
 import Foundation
 
-public func allKeysForValue<K, V: Equatable>(dict: [K: V], valueToMatch: V) -> [K]? {
+public func allKeysForValue<K, V: Equatable>(_ dict: [K: V], valueToMatch: V) -> [K]? {
     
     let possibleValues = dict.filter ({ (key, value) -> Bool in
         return value == valueToMatch
@@ -49,4 +49,4 @@ public func allKeysForValue<K, V: Equatable>(dict: [K: V], valueToMatch: V) -> [
         return possibleValues
     }
     return nil
-}
\ No newline at end of file
+}
diff --git a/SwiftSVG/NSObject+Extensions.swift b/SwiftSVG/NSObject+Extensions.swift
index 777bb54..1d3c3b1 100644
--- a/SwiftSVG/NSObject+Extensions.swift
+++ b/SwiftSVG/NSObject+Extensions.swift
@@ -55,14 +55,14 @@ extension NSObject {
         
         // iterate each objc_property_t struct
         for i in 0..<count {
-            let property = properties[Int(i)];
+            let property = properties?[Int(i)];
             
             // retrieve the property name by calling property_getName function
             let cname = property_getName(property);
             
             // convert the c string into a Swift string
-            let name = String.fromCString(cname);
-            results.append(name!);
+            let name = String(cString: cname!);
+            results.append(name);
         }
         
         // release objc_property_t structs
@@ -78,4 +78,4 @@ extension NSObject {
         return classString
     }
     
-}
\ No newline at end of file
+}
diff --git a/SwiftSVG/SVGParser.swift b/SwiftSVG/SVGParser.swift
index 165196d..027ccce 100644
--- a/SwiftSVG/SVGParser.swift
+++ b/SwiftSVG/SVGParser.swift
@@ -48,7 +48,7 @@ private var tagMapping: [String: String] = [
         didSet {
             if let pathStringToParse = d {
                 self.path = pathStringToParse.pathFromSVGString()
-                self.shapeLayer.path = self.path.CGPath
+                self.shapeLayer.path = self.path.cgPath
             }
         }
     }
@@ -56,7 +56,7 @@ private var tagMapping: [String: String] = [
     var fill: String? {
         didSet {
             if let hexFill = fill {
-                self.shapeLayer.fillColor = UIColor(hexString: hexFill).CGColor
+                self.shapeLayer.fillColor = UIColor(hexString: hexFill).cgColor
             }
         }
     }
@@ -64,7 +64,7 @@ private var tagMapping: [String: String] = [
 
 @objc(SVGElement) private class SVGElement: NSObject { }
 
-public class SVGParser : NSObject, NSXMLParserDelegate {
+public class SVGParser : NSObject, XMLParserDelegate {
     
     private var elementStack = Stack<NSObject>()
     
@@ -72,7 +72,7 @@ public class SVGParser : NSObject, NSXMLParserDelegate {
     public var shouldParseSinglePathOnly = false
     internal var paths = [UIBezierPath]()
     
-    convenience init(SVGURL: NSURL, containerLayer: CALayer? = nil, shouldParseSinglePathOnly: Bool = false) {
+    convenience init(SVGURL: URL, containerLayer: CALayer? = nil, shouldParseSinglePathOnly: Bool = false) {
         
         self.init()
         
@@ -80,7 +80,7 @@ public class SVGParser : NSObject, NSXMLParserDelegate {
             self.containerLayer = layer
         }
         
-        if let xmlParser = NSXMLParser(contentsOfURL: SVGURL) {
+        if let xmlParser = XMLParser(contentsOf: SVGURL) {
             xmlParser.delegate = self
             xmlParser.parse()
         } else {
@@ -88,7 +88,7 @@ public class SVGParser : NSObject, NSXMLParserDelegate {
         }
     }
     
-    public func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
+    public func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
         
         if let newElement = tagMapping[elementName] {
             
@@ -119,11 +119,11 @@ public class SVGParser : NSObject, NSXMLParserDelegate {
     }
     
     
-    public func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
+    public func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
         if let lastItem = self.elementStack.last {
             if let keyForValue = allKeysForValue(tagMapping,valueToMatch: lastItem.classNameAsString())?.first {
                 if elementName == keyForValue {
-                    self.elementStack.pop()
+                    _ = self.elementStack.pop()
                 }
             }
         }
diff --git a/SwiftSVG/SVGView.swift b/SwiftSVG/SVGView.swift
index 8652e81..3d173f1 100644
--- a/SwiftSVG/SVGView.swift
+++ b/SwiftSVG/SVGView.swift
@@ -42,12 +42,12 @@ public class SVGView : UIView {
             if let thisName = SVGName {
                 
                 #if !TARGET_INTERFACE_BUILDER
-                    let bundle = NSBundle.mainBundle()
+                    let bundle = Bundle.main
                 #else
                     let bundle = NSBundle(forClass: self.dynamicType)
                 #endif
                 
-                if let url = bundle.URLForResource(thisName, withExtension: "svg") {
+                if let url = bundle.url(forResource: thisName, withExtension: "svg") {
                     self.shapeLayer = CAShapeLayer(SVGURL: url)
                     if self.shapeLayer.superlayer == nil {
                         self.nonOptionalLayer.addSublayer(self.shapeLayer)
diff --git a/SwiftSVG/Stack.swift b/SwiftSVG/Stack.swift
index bad6875..d70798e 100644
--- a/SwiftSVG/Stack.swift
+++ b/SwiftSVG/Stack.swift
@@ -41,7 +41,7 @@ import Foundation
 struct Stack<T> {
     var items = [T]()
     
-    mutating func push(itemToPush: T) {
+    mutating func push(_ itemToPush: T) {
         self.items.append(itemToPush)
     }
     
@@ -74,4 +74,4 @@ extension Stack {
             return nil
         }
     }
-}
\ No newline at end of file
+}
diff --git a/SwiftSVG/String+SVG.swift b/SwiftSVG/String+SVG.swift
index 10a74a3..2634efb 100644
--- a/SwiftSVG/String+SVG.swift
+++ b/SwiftSVG/String+SVG.swift
@@ -37,7 +37,7 @@
 // MARK: Type Definitions
 
 private enum PathType {
-    case Absolute, Relative
+    case absolute, relative
 }
 
 private struct NumberStack {
@@ -65,7 +65,7 @@ private struct NumberStack {
         self.characterStack = String(startCharacter)
     }
     
-    mutating func push(character: Character) {
+    mutating func push(_ character: Character) {
         self.characterStack += String(character)
     }
     
@@ -85,7 +85,7 @@ private struct PreviousCommand {
 
 private protocol Commandable {
     var numberOfRequiredParameters: Int { get }
-    func execute(forPath forPath: UIBezierPath, previousCommand: PreviousCommand?)
+    func execute(forPath: UIBezierPath, previousCommand: PreviousCommand?)
 }
 
 /////////////////////////////////////////////////////
@@ -112,7 +112,7 @@ private class PathCommand : PathCharacter, Commandable {
             return 0
         }
     }
-    var pathType: PathType = .Absolute
+    var pathType: PathType = .absolute
     var parameters: [CGFloat] = Array()
     var path: UIBezierPath = UIBezierPath()
     
@@ -127,7 +127,7 @@ private class PathCommand : PathCharacter, Commandable {
         self.pathType = pathType
     }
     
-    func execute(forPath forPath: UIBezierPath, previousCommand: PreviousCommand? = nil) {
+    func execute(forPath: UIBezierPath, previousCommand: PreviousCommand? = nil) {
         assert(false, "Subclasses must implement this method")
     }
     
@@ -148,23 +148,23 @@ private class PathCommand : PathCharacter, Commandable {
         return true
     }
     
-    func pushCoordinateAndExecuteIfPossible(coordinate: CGFloat, previousCommand: PreviousCommand? = nil) -> PreviousCommand? {
+    func pushCoordinateAndExecuteIfPossible(_ coordinate: CGFloat, previousCommand: PreviousCommand? = nil) -> PreviousCommand? {
         self.parameters.append(coordinate)
         if self.canExecute() {
             self.execute(forPath: self.path, previousCommand: previousCommand)
             let returnParameters = self.parameters
-            self.parameters.removeAll(keepCapacity: false)
+            self.parameters.removeAll(keepingCapacity: false)
             return PreviousCommand(commandLetter: String(self.character!), parameters: returnParameters)
         }
         return nil
     }
     
-    func pointForPathType(point: CGPoint) -> CGPoint {
+    func pointForPathType(_ point: CGPoint) -> CGPoint {
         switch self.pathType {
-        case .Absolute:
+        case .absolute:
             return point
-        case .Relative:
-            return CGPointMake(point.x + self.path.currentPoint.x, point.y + self.path.currentPoint.y)
+        case .relative:
+            return CGPoint(x: point.x + self.path.currentPoint.x, y: point.y + self.path.currentPoint.y)
         }
     }
 }
@@ -181,9 +181,9 @@ private class MoveTo : PathCommand {
         }
     }
     
-    override func execute(forPath forPath: UIBezierPath, previousCommand: PreviousCommand? = nil) {
-        let point = self.pointForPathType(CGPointMake(self.parameters[0], self.parameters[1]))
-        forPath.moveToPoint(point)
+    override func execute(forPath: UIBezierPath, previousCommand: PreviousCommand? = nil) {
+        let point = self.pointForPathType(CGPoint(x: self.parameters[0], y: self.parameters[1]))
+        forPath.move(to: point)
     }
 }
 
@@ -195,8 +195,8 @@ private class ClosePath : PathCommand {
         }
     }
     
-    override func execute(forPath forPath: UIBezierPath, previousCommand: PreviousCommand? = nil) {
-        forPath.closePath()
+    override func execute(forPath: UIBezierPath, previousCommand: PreviousCommand? = nil) {
+        forPath.close()
     }
 }
 
@@ -208,9 +208,9 @@ private class LineTo : PathCommand {
         }
     }
     
-    override func execute(forPath forPath: UIBezierPath, previousCommand: PreviousCommand? = nil) {
-        let point = self.pointForPathType(CGPointMake(self.parameters[0], self.parameters[1]))
-        forPath.addLineToPoint(point)
+    override func execute(forPath: UIBezierPath, previousCommand: PreviousCommand? = nil) {
+        let point = self.pointForPathType(CGPoint(x: self.parameters[0], y: self.parameters[1]))
+        forPath.addLine(to: point)
     }
 }
 
@@ -222,10 +222,10 @@ private class HorizontalLineTo : PathCommand {
         }
     }
     
-    override func execute(forPath forPath: UIBezierPath, previousCommand: PreviousCommand? = nil) {
+    override func execute(forPath: UIBezierPath, previousCommand: PreviousCommand? = nil) {
         let x = self.parameters[0]
-        let point = (self.pathType == PathType.Absolute ? CGPointMake(x, forPath.currentPoint.y) : CGPointMake(forPath.currentPoint.x + x, forPath.currentPoint.y))
-        forPath.addLineToPoint(point)
+        let point = (self.pathType == PathType.absolute ? CGPoint(x: x, y: forPath.currentPoint.y) : CGPoint(x: forPath.currentPoint.x + x, y: forPath.currentPoint.y))
+        forPath.addLine(to: point)
     }
 }
 
@@ -237,10 +237,10 @@ private class VerticalLineTo : PathCommand {
         }
     }
     
-    override func execute(forPath forPath: UIBezierPath, previousCommand: PreviousCommand? = nil) {
+    override func execute(forPath: UIBezierPath, previousCommand: PreviousCommand? = nil) {
         let y = self.parameters[0]
-        let point = (self.pathType == PathType.Absolute ? CGPointMake(forPath.currentPoint.x, y) : CGPointMake(forPath.currentPoint.x, forPath.currentPoint.y + y))
-        forPath.addLineToPoint(point)
+        let point = (self.pathType == PathType.absolute ? CGPoint(x: forPath.currentPoint.x, y: y) : CGPoint(x: forPath.currentPoint.x, y: forPath.currentPoint.y + y))
+        forPath.addLine(to: point)
     }
 }
 
@@ -252,11 +252,11 @@ private class CurveTo : PathCommand {
         }
     }
     
-    override func execute(forPath forPath: UIBezierPath, previousCommand: PreviousCommand? = nil) {
-        let startControl = self.pointForPathType(CGPointMake(self.parameters[0], self.parameters[1]))
-        let endControl = self.pointForPathType(CGPointMake(self.parameters[2], self.parameters[3]))
-        let point = self.pointForPathType(CGPointMake(self.parameters[4], self.parameters[5]))
-        forPath.addCurveToPoint(point, controlPoint1: startControl, controlPoint2: endControl)
+    override func execute(forPath: UIBezierPath, previousCommand: PreviousCommand? = nil) {
+        let startControl = self.pointForPathType(CGPoint(x: self.parameters[0], y: self.parameters[1]))
+        let endControl = self.pointForPathType(CGPoint(x: self.parameters[2], y: self.parameters[3]))
+        let point = self.pointForPathType(CGPoint(x: self.parameters[4], y: self.parameters[5]))
+        forPath.addCurve(to: point, controlPoint1: startControl, controlPoint2: endControl)
     }
 }
 
@@ -268,12 +268,12 @@ private class SmoothCurveTo : PathCommand {
         }
     }
     
-    override func execute(forPath forPath: UIBezierPath, previousCommand: PreviousCommand? = nil) {
+    override func execute(forPath: UIBezierPath, previousCommand: PreviousCommand? = nil) {
         
         if let previousParams = previousCommand?.parameters {
             
-            let point = self.pointForPathType(CGPointMake(self.parameters[2], self.parameters[3]))
-            let controlEnd = self.pointForPathType(CGPointMake(self.parameters[0], self.parameters[1]))
+            let point = self.pointForPathType(CGPoint(x: self.parameters[2], y: self.parameters[3]))
+            let controlEnd = self.pointForPathType(CGPoint(x: self.parameters[0], y: self.parameters[1]))
             
             let currentPoint = forPath.currentPoint
             
@@ -287,14 +287,14 @@ private class SmoothCurveTo : PathCommand {
                     controlStartX = (2.0 * currentPoint.x) - previousParams[2]
                     controlStartY = (2.0 * currentPoint.y) - previousParams[3]
                 case "c":
-                    let oldCurrentPoint = CGPointMake(currentPoint.x - previousParams[4], currentPoint.y - previousParams[5])
+                    let oldCurrentPoint = CGPoint(x: currentPoint.x - previousParams[4], y: currentPoint.y - previousParams[5])
                     controlStartX = (2.0 * currentPoint.x) - (previousParams[2] + oldCurrentPoint.x)
                     controlStartY = (2.0 * currentPoint.y) - (previousParams[3] + oldCurrentPoint.y)
                 case "S":
                     controlStartX = (2.0 * currentPoint.x) - previousParams[0]
                     controlStartY = (2.0 * currentPoint.y) - previousParams[1]
                 case "s":
-                    let oldCurrentPoint = CGPointMake(currentPoint.x - previousParams[2], currentPoint.y - previousParams[3])
+                    let oldCurrentPoint = CGPoint(x: currentPoint.x - previousParams[2], y: currentPoint.y - previousParams[3])
                     controlStartX = (2.0 * currentPoint.x) - (previousParams[0] + oldCurrentPoint.x)
                     controlStartY = (2.0 * currentPoint.y) - (previousParams[1] + oldCurrentPoint.y)
                 default:
@@ -305,7 +305,7 @@ private class SmoothCurveTo : PathCommand {
                 assert(false, "Must supply previous command for SmoothCurveTo")
             }
             
-            forPath.addCurveToPoint(point, controlPoint1: CGPointMake(controlStartX, controlStartY), controlPoint2: controlEnd)
+            forPath.addCurve(to: point, controlPoint1: CGPoint(x: controlStartX, y: controlStartY), controlPoint2: controlEnd)
             
         } else {
             assert(false, "Must supply previous parameters for SmoothCurveTo")
@@ -321,10 +321,10 @@ private class QuadraticCurveTo : PathCommand {
         }
     }
     
-    override func execute(forPath forPath: UIBezierPath, previousCommand: PreviousCommand? = nil) {
-        let controlPoint = self.pointForPathType(CGPointMake(self.parameters[0], self.parameters[1]))
-        let point = self.pointForPathType(CGPointMake(self.parameters[2], self.parameters[3]))
-        forPath.addQuadCurveToPoint(point, controlPoint: controlPoint)
+    override func execute(forPath: UIBezierPath, previousCommand: PreviousCommand? = nil) {
+        let controlPoint = self.pointForPathType(CGPoint(x: self.parameters[0], y: self.parameters[1]))
+        let point = self.pointForPathType(CGPoint(x: self.parameters[2], y: self.parameters[3]))
+        forPath.addQuadCurve(to: point, controlPoint: controlPoint)
     }
 }
 
@@ -336,11 +336,11 @@ private class SmoothQuadraticCurveTo : PathCommand {
         }
     }
     
-    override func execute(forPath forPath: UIBezierPath, previousCommand: PreviousCommand? = nil) {
+    override func execute(forPath: UIBezierPath, previousCommand: PreviousCommand? = nil) {
         
         if let previousParams = previousCommand?.parameters {
             
-            let point = self.pointForPathType(CGPointMake(self.parameters[0], self.parameters[1]))
+            let point = self.pointForPathType(CGPoint(x: self.parameters[0], y: self.parameters[1]))
             var controlPoint = forPath.currentPoint
             
             if let previousChar = previousCommand?.commandLetter {
@@ -349,10 +349,10 @@ private class SmoothQuadraticCurveTo : PathCommand {
                 
                 switch previousChar {
                 case "Q":
-                    controlPoint = CGPointMake((2.0 * currentPoint.x) - previousParams[0], (2.0 * currentPoint.y) - previousParams[1])
+                    controlPoint = CGPoint(x: (2.0 * currentPoint.x) - previousParams[0], y: (2.0 * currentPoint.y) - previousParams[1])
                 case "q":
-                    let oldCurrentPoint = CGPointMake(currentPoint.x - previousParams[2], currentPoint.y - previousParams[3])
-                    controlPoint = CGPointMake((2.0 * currentPoint.x) - (previousParams[0] + oldCurrentPoint.x), (2.0 * currentPoint.y) - (previousParams[1] + oldCurrentPoint.y))
+                    let oldCurrentPoint = CGPoint(x: currentPoint.x - previousParams[2], y: currentPoint.y - previousParams[3])
+                    controlPoint = CGPoint(x: (2.0 * currentPoint.x) - (previousParams[0] + oldCurrentPoint.x), y: (2.0 * currentPoint.y) - (previousParams[1] + oldCurrentPoint.y))
                 default:
                     break
                 }
@@ -361,7 +361,7 @@ private class SmoothQuadraticCurveTo : PathCommand {
                 assert(false, "Must supply previous command for SmoothQuadraticCurveTo")
             }
             
-            forPath.addQuadCurveToPoint(point, controlPoint: controlPoint)
+            forPath.addQuadCurve(to: point, controlPoint: controlPoint)
             
         } else {
             assert(false, "Must supply previous parameters for SmoothQuadraticCurveTo")
@@ -375,24 +375,24 @@ private class SmoothQuadraticCurveTo : PathCommand {
 // MARK: Character Dictionary
 
 private let characterDictionary: [Character: PathCharacter] = [
-    "M": MoveTo(character: "M", pathType: PathType.Absolute),
-    "m": MoveTo(character: "m", pathType: PathType.Relative),
-    "C": CurveTo(character: "C", pathType: PathType.Absolute),
-    "c": CurveTo(character: "c", pathType: PathType.Relative),
-    "S": SmoothCurveTo(character: "S", pathType: PathType.Absolute),
-    "s": SmoothCurveTo(character: "s", pathType: PathType.Relative),
-    "L": LineTo(character: "L", pathType: PathType.Absolute),
-    "l": LineTo(character: "l", pathType: PathType.Relative),
-    "H": HorizontalLineTo(character: "H", pathType: PathType.Absolute),
-    "h": HorizontalLineTo(character: "h", pathType: PathType.Relative),
-    "V": VerticalLineTo(character: "V", pathType: PathType.Absolute),
-    "v": VerticalLineTo(character: "v", pathType: PathType.Relative),
-    "Q": QuadraticCurveTo(character: "Q", pathType: PathType.Absolute),
-    "q": QuadraticCurveTo(character: "q", pathType: PathType.Relative),
-    "T": SmoothQuadraticCurveTo(character: "T", pathType: PathType.Absolute),
-    "t": SmoothQuadraticCurveTo(character: "t", pathType: PathType.Relative),
-    "Z": ClosePath(character: "Z", pathType: PathType.Absolute),
-    "z": ClosePath(character: "z", pathType: PathType.Relative),
+    "M": MoveTo(character: "M", pathType: PathType.absolute),
+    "m": MoveTo(character: "m", pathType: PathType.relative),
+    "C": CurveTo(character: "C", pathType: PathType.absolute),
+    "c": CurveTo(character: "c", pathType: PathType.relative),
+    "S": SmoothCurveTo(character: "S", pathType: PathType.absolute),
+    "s": SmoothCurveTo(character: "s", pathType: PathType.relative),
+    "L": LineTo(character: "L", pathType: PathType.absolute),
+    "l": LineTo(character: "l", pathType: PathType.relative),
+    "H": HorizontalLineTo(character: "H", pathType: PathType.absolute),
+    "h": HorizontalLineTo(character: "h", pathType: PathType.relative),
+    "V": VerticalLineTo(character: "V", pathType: PathType.absolute),
+    "v": VerticalLineTo(character: "v", pathType: PathType.relative),
+    "Q": QuadraticCurveTo(character: "Q", pathType: PathType.absolute),
+    "q": QuadraticCurveTo(character: "q", pathType: PathType.relative),
+    "T": SmoothQuadraticCurveTo(character: "T", pathType: PathType.absolute),
+    "t": SmoothQuadraticCurveTo(character: "t", pathType: PathType.relative),
+    "Z": ClosePath(character: "Z", pathType: PathType.absolute),
+    "z": ClosePath(character: "z", pathType: PathType.relative),
     "-": SignCharacter(character: "-"),
     ".": NumberCharacter(character: "."),
     "0": NumberCharacter(character: "0"),
@@ -428,7 +428,7 @@ public extension String {
     }
 }
 
-func parseSVGPath(pathString: String, forPath: UIBezierPath? = nil) -> UIBezierPath {
+func parseSVGPath(_ pathString: String, forPath: UIBezierPath? = nil) -> UIBezierPath {
     
     assert(pathString.hasPrefix("M") || pathString.hasPrefix("m"), "Path d attribute must begin with MoveTo Command (\"M\")")
     
diff --git a/SwiftSVG/String+Subscript.swift b/SwiftSVG/String+Subscript.swift
index 310808e..a5aa6d3 100644
--- a/SwiftSVG/String+Subscript.swift
+++ b/SwiftSVG/String+Subscript.swift
@@ -46,14 +46,14 @@ public extension String {
     
     subscript(index: Int) -> Character {
         get {
-            let index = self.startIndex.advancedBy(index)
+            let index = self.characters.index(self.startIndex, offsetBy: index)
             return self[index]
         }
     }
     
     subscript(integerRange: Range<Int>) -> String {
-        let start = self.startIndex.advancedBy(integerRange.startIndex)
-        let end = self.startIndex.advancedBy(integerRange.endIndex)
+        let start = self.characters.index(self.startIndex, offsetBy: integerRange.lowerBound)
+        let end = self.characters.index(self.startIndex, offsetBy: integerRange.upperBound)
         let range = start..<end
         return self[range]
     }
diff --git a/SwiftSVG/UIBezierPath+SVG.swift b/SwiftSVG/UIBezierPath+SVG.swift
index cac6c70..d4a6acd 100644
--- a/SwiftSVG/UIBezierPath+SVG.swift
+++ b/SwiftSVG/UIBezierPath+SVG.swift
@@ -36,16 +36,16 @@ extension UIBezierPath {
     
     public convenience init(pathString: String) {
         self.init()
-        parseSVGPath(pathString, forPath: self)
+        _ = parseSVGPath(pathString, forPath: self)
     }
     
-    public class func pathWithSVGURL(SVGURL: NSURL) -> UIBezierPath? {
+    public class func pathWithSVGURL(_ SVGURL: URL) -> UIBezierPath? {
         let parser = SVGParser(SVGURL: SVGURL, containerLayer: nil, shouldParseSinglePathOnly: true)
         return parser.paths.first
 	}
 
-	public class func pathsWithSVGURL(SVGURL: NSURL) -> [UIBezierPath] {
+	public class func pathsWithSVGURL(_ SVGURL: URL) -> [UIBezierPath] {
 		let parser = SVGParser(SVGURL: SVGURL, containerLayer: nil, shouldParseSinglePathOnly: true)
 		return parser.paths
 	}
-}
\ No newline at end of file
+}
diff --git a/SwiftSVG/UIColor+Extensions.swift b/SwiftSVG/UIColor+Extensions.swift
index 82be6b3..4acd887 100644
--- a/SwiftSVG/UIColor+Extensions.swift
+++ b/SwiftSVG/UIColor+Extensions.swift
@@ -56,9 +56,12 @@ public extension UIColor {
         var hexBlue = "00"
         
         if workingString.characters.count == 6 {
-            hexRed = workingString[0...1]
-            hexGreen = workingString[2...3]
-            hexBlue = workingString[4...5]
+			var range = workingString.startIndex ..< workingString.index(workingString.startIndex, offsetBy: 2)
+			hexRed = workingString.substring(with: range)
+			range = workingString.index(workingString.startIndex, offsetBy: 2) ..< workingString.index(workingString.startIndex, offsetBy: 4)
+			hexGreen = workingString.substring(with: range)
+			range = workingString.index(workingString.startIndex, offsetBy: 4) ..< workingString.index(workingString.startIndex, offsetBy: 6)
+			hexBlue = workingString.substring(with: range)
         } else if workingString.characters.count == 3 {
             let redValue = workingString[0]
             let greenValue = workingString[1]
diff --git a/SwiftSVG/UIView+SVG.swift b/SwiftSVG/UIView+SVG.swift
index d75bbdc..c769396 100644
--- a/SwiftSVG/UIView+SVG.swift
+++ b/SwiftSVG/UIView+SVG.swift
@@ -40,9 +40,9 @@ extension UIView {
         self.nonOptionalLayer.addSublayer(shapeLayer)
     }
     
-    public convenience init(SVGURL: NSURL) {
+    public convenience init(SVGURL: URL) {
         self.init()
         let shapeLayer = CAShapeLayer(SVGURL: SVGURL)
         self.nonOptionalLayer.addSublayer(shapeLayer)
     }
-}
\ No newline at end of file
+}