diff --git a/GIF-Swift/iOSDevCenters+GIF.swift b/GIF-Swift/iOSDevCenters+GIF.swift index 02153d4..e10c830 100644 --- a/GIF-Swift/iOSDevCenters+GIF.swift +++ b/GIF-Swift/iOSDevCenters+GIF.swift @@ -8,21 +8,6 @@ import UIKit import ImageIO -// FIXME: comparison operators with optionals were removed from the Swift Standard Libary. -// Consider refactoring the code to use the non-optional operators. -fileprivate func < (lhs: T?, rhs: T?) -> Bool { - switch (lhs, rhs) { - case let (l?, r?): - return l < r - case (nil, _?): - return true - default: - return false - } -} - - - extension UIImage { public class func gifImageWithData(_ data: Data) -> UIImage? { @@ -35,12 +20,11 @@ extension UIImage { } public class func gifImageWithURL(_ gifUrl:String) -> UIImage? { - guard let bundleURL:URL? = URL(string: gifUrl) - else { - print("image named \"\(gifUrl)\" doesn't exist") - return nil + guard let bundleURL:URL = URL(string: gifUrl) else { + print("image named \"\(gifUrl)\" doesn't exist") + return nil } - guard let imageData = try? Data(contentsOf: bundleURL!) else { + guard let imageData = try? Data(contentsOf: bundleURL) else { print("image named \"\(gifUrl)\" into NSData") return nil } @@ -49,10 +33,9 @@ extension UIImage { } public class func gifImageWithName(_ name: String) -> UIImage? { - guard let bundleURL = Bundle.main - .url(forResource: name, withExtension: "gif") else { - print("SwiftGif: This image named \"\(name)\" does not exist") - return nil + guard let bundleURL = Bundle.main.url(forResource: name, withExtension: "gif") else { + print("SwiftGif: This image named \"\(name)\" does not exist") + return nil } guard let imageData = try? Data(contentsOf: bundleURL) else { print("SwiftGif: Cannot turn image named \"\(name)\" into NSData") @@ -62,8 +45,9 @@ extension UIImage { return gifImageWithData(imageData) } - class func delayForImageAtIndex(_ index: Int, source: CGImageSource!) -> Double { - var delay = 0.1 + private class func delayForImageAtIndex(_ index: Int, source: CGImageSource!) -> Double { + let defaultDelay = 0.032 // 30 fps + var delay = defaultDelay let cfProperties = CGImageSourceCopyPropertiesAtIndex(source, index, nil) let gifProperties: CFDictionary = unsafeBitCast( @@ -80,102 +64,41 @@ extension UIImage { Unmanaged.passUnretained(kCGImagePropertyGIFDelayTime).toOpaque()), to: AnyObject.self) } - delay = delayObject as! Double + guard let castedDelay = delayObject as? Double else { return delay } - if delay < 0.1 { - delay = 0.1 - } + delay = castedDelay < defaultDelay ? defaultDelay : castedDelay return delay } - class func gcdForPair(_ a: Int?, _ b: Int?) -> Int { - var a = a - var b = b - if b == nil || a == nil { - if b != nil { - return b! - } else if a != nil { - return a! - } else { - return 0 - } - } - - if a < b { - let c = a - a = b - b = c - } - - var rest: Int - while true { - rest = a! % b! - - if rest == 0 { - return b! - } else { - a = b - b = rest - } - } - } - - class func gcdForArray(_ array: Array) -> Int { + private class func gcdForArray(_ array: [Int]) -> Int { if array.isEmpty { return 1 } - var gcd = array[0] - - for val in array { - gcd = UIImage.gcdForPair(val, gcd) - } - - return gcd + return array.sorted(by: <).first ?? 1 } - class func animatedImageWithSource(_ source: CGImageSource) -> UIImage? { + private class func animatedImageWithSource(_ source: CGImageSource) -> UIImage? { let count = CGImageSourceGetCount(source) - var images = [CGImage]() - var delays = [Int]() + let images = (0..