├── .gitignore ├── .swift-version ├── LICENSE ├── MultiRange ├── Info.plist ├── MultiRange.h └── MultiRange.swift ├── README.md ├── SwiftyCocoa ├── Dispatch+Extensions.swift ├── Info.plist ├── NSAttributedString+Extensions.swift ├── NSLayoutConstraint+Extensions.swift ├── NSNotificationCenter+Extensions.swift ├── NSObject+Extensions.swift ├── NSThread+Extensions.swift ├── SwiftyCocoa.h └── URL+Extensions.swift ├── SwiftyCore ├── BinaryInteger+Extensions.swift ├── CollectionType+Extensions.swift ├── Comparable+Extensions.swift ├── Dictionary+Extensions.swift ├── FloatingPoint+Extensions.swift ├── Info.plist ├── Optional+Extensions.swift ├── OptionalConvertible.swift ├── RangeReplaceableCollectionType+Extensions.swift ├── SequenceType+Extensions.swift ├── SignedNumeric+Extensions.swift ├── SortOrder.swift ├── StringLiteralConvertible+Extensions.swift ├── Swift+Extensions.swift ├── SwiftyCore.h └── UnsignedInteger+Extensions.swift ├── SwiftyGeometry ├── CGFloatTuple.swift ├── CGGeometry+CGFloatTuple.swift ├── CGPoint+Extensions.swift ├── CGRect+Extensions.swift ├── Info.plist ├── SwiftyGeometry.h └── UIEdgeInsets+Extensions.swift ├── SwiftySwift.podspec ├── SwiftySwift.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcshareddata │ ├── IDETemplateMacros.plist │ └── xcschemes │ ├── MultiRange.xcscheme │ ├── SwiftyCocoa.xcscheme │ ├── SwiftyCore.xcscheme │ ├── SwiftyGeometry.xcscheme │ ├── SwiftySwift.xcscheme │ └── SwiftyUIKit.xcscheme ├── SwiftySwift ├── Info.plist └── SwiftySwift.h ├── SwiftySwiftTests ├── Info.plist └── SwiftySwiftTests.swift └── SwiftyUIKit ├── Info.plist ├── SwiftyUIKit.h ├── UICollectionView+Extensions.swift ├── UIColor+Extensions.swift ├── UIFont+Extensions.swift ├── UIGestureRecognizer+Extensions.swift ├── UIImage+Extensions.swift ├── UIImageView+Extensions.swift ├── UITableView+Extensions.swift ├── UIView+Extensions.swift └── UIViewController+Extensions.swift /.gitignore: -------------------------------------------------------------------------------- 1 | SwiftySwift.xcodeproj/xcuserdata 2 | SwiftySwift.xcodeproj/project.xcworkspace/xcuserdata 3 | *.xccheckout 4 | Carthage/Build 5 | DerivedData 6 | -------------------------------------------------------------------------------- /.swift-version: -------------------------------------------------------------------------------- 1 | 4.0 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015 Agustín de Cabrera 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a 4 | copy of this software and associated documentation files (the "Software"), 5 | to deal in the Software without restriction, including without limitation 6 | the rights to use, copy, modify, merge, publish, distribute, sublicense, 7 | and/or sell copies of the Software, and to permit persons to whom the 8 | Software is furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 18 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 19 | IN THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /MultiRange/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /MultiRange/MultiRange.h: -------------------------------------------------------------------------------- 1 | // 2 | // MultiRange.h 3 | // MultiRange 4 | // 5 | // Created by Agustín de Cabrera on 3/9/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | 11 | //! Project version number for MultiRange. 12 | FOUNDATION_EXPORT double MultiRangeVersionNumber; 13 | 14 | //! Project version string for MultiRange. 15 | FOUNDATION_EXPORT const unsigned char MultiRangeVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /MultiRange/MultiRange.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MultiRange.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustín de Cabrera on 10/27/15. 6 | // Copyright © 2015 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | /** 10 | Useful methods to iterate over a grid 11 | 12 | These methods return a sequence that can be iterated over, and will provide a 13 | tuple for each combination between the start and end tuples 14 | 15 | e.g.: (1,1)...(2,2) will generate (1,1), (1,2), (2,1), (2,2) 16 | **/ 17 | 18 | public func ..< (start: (T, T), end: (T, T)) -> MultiRange { 19 | return MultiRange( 20 | rows: start.0 ..< end.0, 21 | columns: start.1 ..< end.1 22 | ) 23 | } 24 | 25 | public func ... (start: (T, T), end: (T, T)) -> MultiRange { 26 | return MultiRange( 27 | rows: CountableRange(start.0 ... end.0), 28 | columns: CountableRange(start.1 ... end.1) 29 | ) 30 | } 31 | 32 | public struct MultiRange : Equatable, Sequence, CustomStringConvertible, CustomDebugStringConvertible 33 | where T: Strideable & Comparable, T.Stride: SignedInteger { 34 | 35 | private let rows: CountableRange 36 | private let columns: CountableRange 37 | 38 | init(rows: CountableRange, columns: CountableRange) { 39 | self.rows = rows 40 | self.columns = columns 41 | } 42 | 43 | public func makeIterator() -> AnyIterator<(T, T)> { 44 | return multiRangIterator(rows, columns) 45 | } 46 | 47 | public func contains(_ element: (T, T)) -> Bool { 48 | return contains { $0 == element.0 && $1 == element.1 } 49 | } 50 | 51 | public func underestimateCount() -> Int { 52 | return rows.underestimatedCount * columns.underestimatedCount 53 | } 54 | 55 | public var description: String { 56 | return "(\(rows.lowerBound), \(columns.lowerBound))..<(\(rows.upperBound), \(columns.upperBound))" 57 | } 58 | 59 | public var debugDescription: String { 60 | return "MultiRange(\(description))" 61 | } 62 | 63 | public static func == (lhs: MultiRange, rhs: MultiRange) -> Bool { 64 | return lhs.rows == rhs.rows && lhs.columns == rhs.columns 65 | } 66 | } 67 | 68 | private func multiRangIterator(_ rows: CountableRange, _ columns: CountableRange) -> AnyIterator<(T, T)> { 69 | // lazy generators for each row and column 70 | let lazyPointSequence = rows.lazy.map { r in 71 | columns.lazy.map({ c in (r, c) }) 72 | } 73 | let columnIterators = lazyPointSequence.map { $0.makeIterator() } 74 | var rowIterator = columnIterators.makeIterator() 75 | 76 | var current = rowIterator.next() 77 | return AnyIterator() { 78 | if let next = current?.next() { 79 | return next 80 | } else { 81 | current = rowIterator.next() 82 | return current?.next() 83 | } 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Purpose 2 | -------------- 3 | 4 | SwiftySwift is a collection of useful extensions for Swift types and Cocoa objects. 5 | -------------------------------------------------------------------------------- /SwiftyCocoa/Dispatch+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Dispatch+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension DispatchQueue { 12 | public func asyncAfter(delay: TimeInterval, 13 | qos: DispatchQoS = .unspecified, 14 | flags: DispatchWorkItemFlags = [], 15 | execute work: @escaping @convention(block) () -> Void) { 16 | asyncAfter(deadline: .now() + delay, qos: qos, flags: flags, execute: work) 17 | } 18 | } 19 | 20 | // MARK: Identity 21 | 22 | extension DispatchQueue { 23 | /// Returns `true` if the receiver is the queue being executed. 24 | public func isCurrent() -> Bool { 25 | return identity == DispatchQueue.getCurrentIdentity() 26 | } 27 | 28 | private static let identityKey = DispatchSpecificKey() 29 | 30 | private var identity: UnsafeMutableRawPointer { 31 | if let identity = getSpecific(key: DispatchQueue.identityKey) { 32 | return identity 33 | } 34 | 35 | let newIdentity = UnsafeMutableRawPointer(mutating: label) 36 | setSpecific(key: DispatchQueue.identityKey, value: newIdentity) 37 | return newIdentity 38 | } 39 | 40 | private static func getCurrentIdentity() -> UnsafeMutableRawPointer? { 41 | return DispatchQueue.getSpecific(key: DispatchQueue.identityKey) 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /SwiftyCocoa/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /SwiftyCocoa/NSAttributedString+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NSAttributedString+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | // MARK: NSAttributedString 12 | 13 | extension NSAttributedString { 14 | public convenience init(attributedString attrStr: NSAttributedString, attributes attrs: [NSAttributedStringKey : Any]?) { 15 | guard let attrs = attrs else { 16 | self.init(attributedString: attrStr) 17 | return 18 | } 19 | 20 | let copy = NSMutableAttributedString(attributedString: attrStr) 21 | copy.addAttributes(attrs) 22 | self.init(attributedString: copy) 23 | } 24 | } 25 | 26 | // MARK: - NSMutableAttributedString 27 | 28 | extension NSMutableAttributedString { 29 | public func addAttribute(_ name: NSAttributedStringKey, value: Any) { 30 | addAttribute(name, value: value, range: NSMakeRange(0, self.length)) 31 | } 32 | 33 | public func addAttributes(_ attrs: [NSAttributedStringKey : Any]) { 34 | addAttributes(attrs, range: NSMakeRange(0, self.length)) 35 | } 36 | } 37 | 38 | // MARK: - Operators 39 | 40 | public func +(lhs: NSAttributedString, rhs: NSAttributedString) -> NSAttributedString { 41 | let copy = NSMutableAttributedString(attributedString: lhs) 42 | copy.append(rhs) 43 | return NSAttributedString(attributedString: copy) 44 | } 45 | 46 | public func +=(lhs: inout NSAttributedString, rhs: NSAttributedString) { 47 | lhs = lhs + rhs 48 | } 49 | -------------------------------------------------------------------------------- /SwiftyCocoa/NSLayoutConstraint+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NSLayoutConstraint+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | // MARK: - NSLayoutConstraint 12 | 13 | extension NSLayoutConstraint { 14 | public class func constraints(withVisualFormats formats: [String], options opts: NSLayoutFormatOptions, metrics: [String : Any]?, views: [String : Any]) -> [NSLayoutConstraint] { 15 | return formats.flatMap { 16 | NSLayoutConstraint.constraints(withVisualFormat: $0, options: opts, metrics: metrics, views: views) 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /SwiftyCocoa/NSNotificationCenter+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NSNotificationCenter+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | // MARK: - NSNotificationCenter 12 | 13 | extension NotificationCenter { 14 | public func addObserver(forName name: NSNotification.Name?, object: Any? = nil, using block: @escaping (Notification) -> Void) -> NSObjectProtocol { 15 | return addObserver(forName: name, object: object, queue: nil, using: block) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /SwiftyCocoa/NSObject+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | // MARK: - NSObject 12 | 13 | extension NSObject { 14 | public func perform(_ block: () -> Void) { 15 | block() 16 | } 17 | 18 | public func performAfter(delay: TimeInterval, _ block: @escaping () -> Void) { 19 | DispatchQueue.main.asyncAfter(delay: delay) { [weak self] in 20 | self?.perform(block) 21 | } 22 | } 23 | 24 | public func performInBackground(_ block: @escaping () -> Void) { 25 | DispatchQueue.global(qos: .default).async(execute: block) 26 | } 27 | 28 | public func performInMainThread(_ block: @escaping () -> Void) { 29 | DispatchQueue.main.async(execute: block) 30 | } 31 | 32 | public var className: String { 33 | return type(of: self).className 34 | } 35 | public static var className: String { 36 | return stringFromClass(self) 37 | } 38 | 39 | public func attach(_ object: AnyObject) { 40 | objc_setAssociatedObject(self, Unmanaged.passUnretained(object).toOpaque(), object, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) 41 | } 42 | public func detach(_ object: AnyObject) { 43 | objc_setAssociatedObject(self, Unmanaged.passUnretained(object).toOpaque(), nil, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /SwiftyCocoa/NSThread+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NSThread+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | // MARK: - NSThread 12 | 13 | extension Thread { 14 | public func objectFromThreadDictionary(_ key:NSCopying, defaultValue: @autoclosure () -> T) -> T { 15 | 16 | if let result = threadDictionary[key] as? T { 17 | return result 18 | } else { 19 | let newObject = defaultValue() 20 | threadDictionary[key] = newObject 21 | return newObject 22 | } 23 | } 24 | 25 | public class func objectFromThreadDictionary(_ key:NSCopying, defaultValue: @autoclosure () -> T) -> T { 26 | return current.objectFromThreadDictionary(key, defaultValue: defaultValue) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /SwiftyCocoa/SwiftyCocoa.h: -------------------------------------------------------------------------------- 1 | // 2 | // SwiftyCocoa.h 3 | // SwiftyCocoa 4 | // 5 | // Created by Agustín de Cabrera on 3/9/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | @import SwiftyCore; 11 | 12 | //! Project version number for SwiftyCocoa. 13 | FOUNDATION_EXPORT double SwiftyCocoaVersionNumber; 14 | 15 | //! Project version string for SwiftyCocoa. 16 | FOUNDATION_EXPORT const unsigned char SwiftyCocoaVersionString[]; 17 | 18 | // In this header, you should import all the public headers of your framework using statements like #import 19 | 20 | 21 | -------------------------------------------------------------------------------- /SwiftyCocoa/URL+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // URL+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Copyright © 2017 Agustín de Cabrera. All rights reserved. 6 | // 7 | 8 | extension URL { 9 | public var resourceIsReachable: Bool { 10 | do { 11 | return try checkResourceIsReachable() 12 | } catch { 13 | return false 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /SwiftyCore/BinaryInteger+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BinaryInteger+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | // MARK: - BinaryInteger 10 | 11 | extension BinaryInteger { 12 | public var isEven: Bool { return (self % 2) == 0 } 13 | public var isOdd: Bool { return !isEven } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /SwiftyCore/CollectionType+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CollectionType+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | // MARK: - CollectionType 10 | 11 | extension Collection { 12 | /// Returns a tuple composed of: the first element in the collection, and 13 | /// the collection without the first element. 14 | public func decompose() -> (Iterator.Element, SubSequence)? { 15 | return first.map { ($0, dropFirst()) } 16 | } 17 | } 18 | 19 | extension Collection where Iterator.Element : Equatable { 20 | public func first(equalTo element: Iterator.Element) -> Iterator.Element? { 21 | return first { $0 == element } 22 | } 23 | } 24 | 25 | extension Collection where Index == Int { 26 | public func randomElement() -> Iterator.Element? { 27 | let count = UInt32(self.count) 28 | guard count > 0 else { return nil } 29 | 30 | let idx = Int(arc4random_uniform(count)) 31 | return self[idx] 32 | } 33 | } 34 | 35 | extension Collection where Iterator.Element: Numeric { 36 | public func sum() -> Iterator.Element? { 37 | return reduce(+) 38 | } 39 | } 40 | 41 | extension Collection where Index == Int { 42 | /// Returns the element at the given index, or `nil` if the index is out of bounds. 43 | public func at(_ index: Int) -> Iterator.Element? { 44 | return indices.contains(index) ? self[index] : nil 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /SwiftyCore/Comparable+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Comparable+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | // MARK: - Comparable 10 | 11 | extension Comparable { 12 | public func compare(_ other: Self) -> ComparisonResult { 13 | return 14 | self < other ? .orderedAscending : 15 | self == other ? .orderedSame : 16 | .orderedDescending 17 | } 18 | } 19 | 20 | extension Comparable { 21 | public func clamp(min: Self, max: Self) -> Self { 22 | return (self < min) ? min : (self > max) ? max : self 23 | } 24 | 25 | public func clamp(_ range: ClosedRange) -> Self { 26 | return clamp(min: range.lowerBound, max: range.upperBound) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /SwiftyCore/Dictionary+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Dictionary+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | // MARK: - Dictionary 10 | 11 | extension Dictionary { 12 | public init(elements: S) where S.Element == (Key, Value) { 13 | self = Dictionary(elements, uniquingKeysWith: { (_, new) in new }) 14 | } 15 | 16 | /// Update the values stored in the dictionary with the given key-value pairs, or, if a key does not exist, add a new entry. 17 | @discardableResult 18 | public mutating func update(withContentsOf newElements: S) -> [Value] 19 | where S.Element == (Key, Value) { 20 | return newElements.compactMap { (k, v) in 21 | updateValue(v, forKey: k) 22 | } 23 | } 24 | 25 | /// Update the values stored in the dictionary with the given key-value pairs, or, if a key does not exist, add a new entry. 26 | @discardableResult 27 | public mutating func update(withContentsOf newElements: S) -> [Value] 28 | where S.Element == Element { 29 | return newElements.compactMap { (k, v) in 30 | updateValue(v, forKey: k) 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /SwiftyCore/FloatingPoint+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FloatingPoint+Extensions.swift 3 | // SwiftyCore 4 | // 5 | // Copyright © 2017 Agustín de Cabrera. All rights reserved. 6 | // 7 | 8 | // MARK: - FloatingPoint 9 | 10 | extension FloatingPoint { 11 | /// Converts the value from degrees to radians. 12 | public func toRadians() -> Self { 13 | return (self/180) * type(of: self).pi 14 | } 15 | 16 | /// Converts the value from radians to degrees. 17 | public func toDegrees() -> Self { 18 | return (self/type(of: self).pi) * 180 19 | } 20 | 21 | public func ratio(min: Self, max: Self) -> Self { 22 | return (self - min)/(max - min) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /SwiftyCore/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /SwiftyCore/Optional+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Optional+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | // MARK: - Optional 10 | 11 | extension Optional { 12 | /// If `self != nil` executes `f(self!)`. 13 | public func unwrap(_ f: (Wrapped) throws -> ()) rethrows { 14 | if let value = self { 15 | try f(value) 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /SwiftyCore/OptionalConvertible.swift: -------------------------------------------------------------------------------- 1 | // 2 | // OptionalConvertible.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | // MARK: - OptionalConvertible 10 | 11 | /// A type that can be represented as an `Optional` 12 | public protocol OptionalConvertible { 13 | associatedtype SomeValue 14 | 15 | var optionalValue: SomeValue? { get } 16 | } 17 | 18 | extension Optional: OptionalConvertible { 19 | public var optionalValue: Wrapped? { return self } 20 | } 21 | 22 | // MARK: - SequenceType + OptionalConvertible 23 | 24 | extension Sequence where Element : OptionalConvertible { 25 | /// return an `Array` containing the non-nil values in `self` 26 | /// DEPRECATED: use `compact` 27 | @available(*, deprecated) 28 | public func flatMap() -> [Element.SomeValue] { 29 | return removingNilValues() 30 | } 31 | 32 | /// return an `Array` containing the non-nil values in `self` 33 | /// DEPRECATED: use `compact` 34 | @available(*, deprecated) 35 | public func removingNilValues() -> [Element.SomeValue] { 36 | var result: [Element.SomeValue] = [] 37 | for element in self { 38 | if let value = element.optionalValue { 39 | result.append(value) 40 | } 41 | } 42 | return result 43 | } 44 | 45 | public func compact() -> [Element.SomeValue] { 46 | return compactMap { $0.optionalValue } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /SwiftyCore/RangeReplaceableCollectionType+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RangeReplaceableCollectionType+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | // MARK: - RangeReplaceableCollectionType 10 | 11 | extension RangeReplaceableCollection { 12 | @discardableResult 13 | mutating public func remove(where predicate: (Iterator.Element) -> Bool) -> Iterator.Element? { 14 | return index(where: predicate).map { remove(at: $0) } 15 | } 16 | } 17 | 18 | extension RangeReplaceableCollection where Iterator.Element : Equatable { 19 | @discardableResult 20 | mutating public func remove(_ element: Iterator.Element) -> Iterator.Element? { 21 | return index(of: element).map { remove(at: $0) } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /SwiftyCore/SequenceType+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SequenceType+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | // MARK: - SequenceType 10 | 11 | extension Sequence where Iterator.Element : Equatable { 12 | /// Return `true` iff all elements of `other` are contained in `self`. 13 | public func contains(_ other: S) -> Bool where S.Element == Element { 14 | return other.all { self.contains($0) } 15 | } 16 | 17 | /// Return an `Array` with the elements of self, with all duplicates removed. 18 | public func filteringDuplicates() -> [Iterator.Element] { 19 | var result: [Iterator.Element] = [] 20 | for element in self { 21 | if !result.contains(element) { result.append(element) } 22 | } 23 | return result 24 | } 25 | } 26 | 27 | extension Sequence where Iterator.Element : Hashable { 28 | /// Return `true` iff all elements of `other` are contained in `self`. 29 | public func contains(_ other: S) -> Bool where S.Iterator.Element == Iterator.Element { 30 | let set = Set(self) 31 | return other.all { set.contains($0) } 32 | } 33 | 34 | /// Return an `Array` with the elements of self, with all duplicates removed. 35 | public func filteringDuplicates() -> [Iterator.Element] { 36 | var result = Array() 37 | var set = Set() 38 | 39 | for element in self { 40 | if !set.contains(element) { 41 | result.append(element) 42 | set.insert(element) 43 | } 44 | } 45 | return result 46 | } 47 | } 48 | 49 | extension Sequence { 50 | /// Return `true` if the predicate returns `true` for all elements of `self` 51 | public func all(_ predicate: (Iterator.Element) -> Bool) -> Bool { 52 | for element in self { 53 | guard predicate(element) else { return false } 54 | } 55 | return true 56 | } 57 | 58 | /// Return `true` if the predicate returns `true` for any element in `self` 59 | public func any(_ predicate: (Iterator.Element) -> Bool) -> Bool { 60 | for element in self { 61 | if predicate(element) { return true } 62 | } 63 | return false 64 | } 65 | 66 | /// Return nil is `self` is empty, otherwise return the result of repeatedly 67 | /// calling `combine` with each element of `self`, in turn. 68 | /// i.e. return `combine(combine(...combine(combine(self[0], self[1]), 69 | /// self[2]),...self[count-2]), self[count-1])`. 70 | public func reduce(_ nextPartialResult: (Iterator.Element, Iterator.Element) throws -> Iterator.Element) rethrows -> Iterator.Element? { 71 | 72 | var generator = self.makeIterator() 73 | guard let first = generator.next() else { 74 | return nil 75 | } 76 | 77 | var result = first 78 | while let element = generator.next() { 79 | result = try nextPartialResult(result, element) 80 | } 81 | 82 | return result 83 | } 84 | 85 | /** 86 | Create a dictionary with the results of applying `transform` to the elements 87 | of `self`, using the first tuple component as the key and the second as the value. 88 | 89 | Returning `nil` will generate no entry for that element. Returning an existing 90 | key will overwrite previous entries. 91 | */ 92 | public func mapToDictionary(_ transform: (Iterator.Element) -> (Key, Value)?) -> [Key: Value] { 93 | let elements = compactMap(transform) 94 | return Dictionary(elements, uniquingKeysWith: { _, new in new }) 95 | } 96 | 97 | /** 98 | Create a dictionary with the results of applying `transform` to the elements 99 | of `self`, using the returned value as the key and the element as the value. 100 | 101 | Returning `nil` will generate no entry for that element. Returning an existing 102 | key will overwrite previous entries. 103 | */ 104 | public func mapToDictionary(_ transform: (Iterator.Element) -> Key?) -> [Key: Iterator.Element] { 105 | return mapToDictionary { value in 106 | transform(value).map({ ($0, value) }) 107 | } 108 | } 109 | 110 | /** 111 | Create a dictionary of arrays based on the results of applying `transform` 112 | to the elements of `self`. The first tuple component is used as key and the 113 | second is added into an array containing all results that share the same key, 114 | which is used as the value. 115 | 116 | Returning `nil` will generate no entry for that element. 117 | */ 118 | public func groupBy(_ transform: (Iterator.Element) -> (Key, Value)?) -> [Key: [Value]] { 119 | let elements = compactMap(transform).map { ($0, [$1]) } 120 | return Dictionary.init(elements, uniquingKeysWith: +) 121 | } 122 | 123 | /** 124 | Create a dictionary of arrays based on the results of applying `transform` 125 | to the elements of `self`. The returned value is used as key and the corresponding 126 | element is added into an array containing all results that share the same key, 127 | which is used as the value. 128 | 129 | Returning `nil` will generate no entry for that element. 130 | */ 131 | public func groupBy(_ transform: (Iterator.Element) -> Key?) -> [Key: [Iterator.Element]] { 132 | let elements = compactMap({ value in 133 | transform(value).map({ ($0, [value]) }) 134 | }) 135 | return Dictionary.init(elements, uniquingKeysWith: +) 136 | } 137 | 138 | /** 139 | Create an array of arrays based on the results of applying `transform` 140 | to the elements of `self`. The first tuple component is used as the key to 141 | group the results, and the second is added into an array containing all results 142 | that share the same key. 143 | 144 | Returning `nil` will generate no entry for that element. 145 | */ 146 | public func groupValues(_ transform: (Iterator.Element) -> (Key, Value)?) -> [[Value]] { 147 | let elements = compactMap(transform) 148 | let keys = elements.map { $0.0 }.filteringDuplicates() 149 | return keys.map { key in 150 | elements.filter { $0.0 == key }.map { $0.1 } 151 | } 152 | } 153 | 154 | /** 155 | Create an array of arrays based on the results of applying `transform` 156 | to the elements of `self`.The returned value is used as the key to 157 | group the results, and corresponding element is added into an array containing 158 | all results that share the same key. 159 | 160 | Returning `nil` will generate no entry for that element. 161 | */ 162 | public func groupValues(_ transform: (Iterator.Element) -> Key?) -> [[Iterator.Element]] { 163 | return groupValues { value in 164 | transform(value).map({ ($0, value) }) 165 | } 166 | } 167 | 168 | /** 169 | Returns a tuple containing, in order, the elements of the sequence divided into two 170 | arrays, with one containing the elements that satisfy the given predicate and the 171 | other the elements that don't. 172 | */ 173 | public func groupFilter(_ includeElement: (Self.Iterator.Element) -> Bool) -> (included: [Self.Iterator.Element], excluded: [Self.Iterator.Element]) { 174 | // group included and excluded elements using the result of the block (true/false) 175 | let grouped = self.groupBy { 176 | includeElement($0) 177 | } 178 | return (grouped[true] ?? [], grouped[false] ?? []) 179 | } 180 | 181 | /// Returns the first non-nil value obtained by applying `transform` to the elements of `self` 182 | public func mapFirst(_ transform: (Iterator.Element) -> T?) -> T? { 183 | for value in self { 184 | if let result = transform(value) { return result } 185 | } 186 | return nil 187 | } 188 | 189 | /// Returns the first non-nil value obtained by applying `transform` to the elements of `self` in reverse order 190 | public func mapLast(_ transform: (Iterator.Element) -> T?) -> T? { 191 | for element in self.lazy.reversed() { 192 | if let result = transform(element) { return result } 193 | } 194 | return nil 195 | } 196 | 197 | /// Use the given closures to extract the values for comparison. If the values 198 | /// are equal compare using the next closure in the list until they are all exhausted 199 | public func min(by values: ((Iterator.Element, Iterator.Element) -> ComparisonResult)...) -> Iterator.Element? { 200 | return self.min(by: values) 201 | } 202 | 203 | /// Use the given closures to extract the values for comparison. If the values 204 | /// are equal compare using the next closure in the list until they are all exhausted 205 | public func min(by values: [(Iterator.Element, Iterator.Element) -> ComparisonResult]) -> Iterator.Element? { 206 | guard values.count > 0 else { return nil } 207 | return self.min(by: orderedBefore(values)) 208 | } 209 | 210 | /// Use the given closures to extract the values for comparison. If the values 211 | /// are equal compare using the next closure in the list until they are all exhausted 212 | public func max(by values: ((Iterator.Element, Iterator.Element) -> ComparisonResult)...) -> Iterator.Element? { 213 | return self.max(by: values) 214 | } 215 | 216 | /// Use the given closures to extract the values for comparison. If the values 217 | /// are equal compare using the next closure in the list until they are all exhausted 218 | public func max(by values: [(Iterator.Element, Iterator.Element) -> ComparisonResult]) -> Iterator.Element? { 219 | guard values.count > 0 else { return nil } 220 | return self.max(by: orderedBefore(values)) 221 | } 222 | 223 | /// Use the given closures to extract the values for comparison. If the values 224 | /// are equal compare using the next closure in the list until they are all exhausted 225 | public func sorted(by values: ((Iterator.Element, Iterator.Element) -> ComparisonResult)...) -> [Iterator.Element] { 226 | return sorted(by: values) 227 | } 228 | 229 | /// Use the given closures to extract the values for comparison. If the values 230 | /// are equal compare using the next closure in the list until they are all exhausted 231 | public func sorted(by values: [(Iterator.Element, Iterator.Element) -> ComparisonResult]) -> [Iterator.Element] { 232 | return sorted(by: orderedBefore(values)) 233 | } 234 | } 235 | 236 | /// Merge a list of comparison blocks into a single block used for sorting a sequence. 237 | /// 238 | /// Use the given closures to extract the values for comparison. If the values 239 | /// are equal compare using the next closure in the list until they are all exhausted 240 | private func orderedBefore(_ comparisons: [(T, T) -> ComparisonResult]) -> (T, T) -> Bool { 241 | return { (lhs, rhs) -> Bool in 242 | for compare in comparisons { 243 | let result = compare(lhs, rhs) 244 | if result != .orderedSame { 245 | return result == .orderedAscending 246 | } 247 | } 248 | return true 249 | } 250 | } 251 | -------------------------------------------------------------------------------- /SwiftyCore/SignedNumeric+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SignedNumeric+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Copyright © 2017 Agustín de Cabrera. All rights reserved. 6 | // 7 | 8 | extension SignedNumeric where Self.Magnitude == Self { 9 | public var sign: Self { 10 | return self == 0 ? 0 : self == abs(self) ? 1 : -1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /SwiftyCore/SortOrder.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SortOrder.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | //MARK: - SortOrder 10 | 11 | /// Determines the possible ways to sort a sequence of Comparable elements 12 | public enum SortOrder { 13 | case ascending 14 | case descending 15 | 16 | /// Return whether the elements are ordered according to their values and 17 | /// the current sort order. 18 | public func isOrderedBefore(_ lhs: T, _ rhs: T) -> Bool { 19 | switch self { 20 | case .ascending: return lhs <= rhs 21 | case .descending: return lhs > rhs 22 | } 23 | } 24 | 25 | /// Return whether the elements are ordered according to their values and 26 | /// the current sort order. Nil values are considered 27 | /// to be ordered after all others. 28 | public func isOrderedBefore(_ lhs: T?, _ rhs: T?) -> Bool { 29 | guard let lhs = lhs else { return false } 30 | guard let rhs = rhs else { return true } 31 | 32 | return isOrderedBefore(lhs, rhs) 33 | } 34 | } 35 | 36 | //MARK: - SequenceType + SortOrder 37 | 38 | extension Sequence { 39 | /// Return an `Array` containing the sorted elements of source according to 40 | /// the values obtained by applying `transform` to each element. 41 | public func sorted(order sortOrder: SortOrder = .ascending, by transform: (Iterator.Element) -> T) -> [Iterator.Element] { 42 | return sorted { 43 | sortOrder.isOrderedBefore(transform($0), transform($1)) 44 | } 45 | } 46 | 47 | /// Return an `Array` containing the sorted elements of source according to 48 | /// the values obtained by applying `transform` to each element. Elements 49 | /// that return nil values are placed at the end of the array. 50 | public func sorted(order sortOrder: SortOrder = .ascending, by transform: (Iterator.Element) -> T?) -> [Iterator.Element] { 51 | return sorted { 52 | sortOrder.isOrderedBefore(transform($0), transform($1)) 53 | } 54 | } 55 | 56 | /// Returns the minimum element in `self` sorted according to 57 | /// the values obtained by applying `transform` to each element. 58 | public func min(sortOrder: SortOrder = .ascending, by transform: (Self.Iterator.Element) -> T) -> Self.Iterator.Element? { 59 | return self.min { 60 | sortOrder.isOrderedBefore(transform($0), transform($1)) 61 | } 62 | } 63 | 64 | /// Returns the maximum element in `self` sorted according to 65 | /// the values obtained by applying `transform` to each element. 66 | public func max(sortOrder: SortOrder = .ascending, by transform: (Self.Iterator.Element) -> T) -> Self.Iterator.Element? { 67 | return self.max { 68 | sortOrder.isOrderedBefore(transform($0), transform($1)) 69 | } 70 | } 71 | } 72 | 73 | extension Sequence where Iterator.Element: Comparable { 74 | /// Returns the elements of the sequence, sorted using the given sort order. 75 | public func sorted(order sortOrder: SortOrder) -> [Self.Iterator.Element] { 76 | return sorted { sortOrder.isOrderedBefore($0, $1) } 77 | } 78 | } 79 | 80 | -------------------------------------------------------------------------------- /SwiftyCore/StringLiteralConvertible+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StringLiteralConvertible+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | // MARK: - StringLiteralConvertible 10 | 11 | extension ExpressibleByStringLiteral where StringLiteralType == ExtendedGraphemeClusterLiteralType { 12 | public init(extendedGraphemeClusterLiteral value: ExtendedGraphemeClusterLiteralType) { 13 | self.init(stringLiteral: value) 14 | } 15 | } 16 | 17 | extension ExpressibleByStringLiteral where StringLiteralType == UnicodeScalarLiteralType { 18 | public init(unicodeScalarLiteral value: UnicodeScalarLiteralType) { 19 | self.init(stringLiteral: value) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /SwiftyCore/Swift+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SwiftySwift.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustín de Cabrera on 6/1/15. 6 | // Copyright (c) 2015 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | // MARK: - cast helpers 10 | 11 | /** 12 | The following methods can be used to perform a cast without being explicit 13 | about the class the object is being cast to, relying instead on the type-inferrence 14 | features of the compiler. 15 | 16 | This allows creating class methods that return an instance of the subclass they are called on. 17 | 18 | e.g. 19 | 20 | class A { 21 | class func factoryMethod() -> Self? { 22 | let instance = createNewInstance() 23 | return cast(instance) 24 | } 25 | } 26 | 27 | class B : A { 28 | } 29 | 30 | A.factoryMethod() // type is inferred as A? 31 | B.factoryMethod() // type is inferred as B? 32 | **/ 33 | 34 | /// Optional cast of `x` as type `V` 35 | public func cast(_ x: U) -> V? { 36 | return x as? V 37 | } 38 | 39 | /// Return all values of `source` that were successfully casted to type `V` 40 | public func castFilter(_ source: S) -> [V] { 41 | return source.compactMap { 42 | $0 as? V 43 | } 44 | } 45 | 46 | /// Return the first value of `source` that was successfully casted to type `V` 47 | public func castFirst(_ source: S) -> V? { 48 | for e in source { 49 | if let casted = e as? V { 50 | return casted 51 | } 52 | } 53 | return nil 54 | } 55 | 56 | /// Forced cast of `x` as type `V` 57 | public func forcedCast(_ x: U) -> V { 58 | return x as! V 59 | } 60 | 61 | public func stringFromClass(_ aClass: AnyClass) -> String { 62 | return NSStringFromClass(aClass).components(separatedBy: ".").last! 63 | } 64 | 65 | // MARK: - math 66 | 67 | /// Linear interpolation between two values 68 | public func lerp(_ from: T, _ to: T, _ progress: T) -> T { 69 | return from * (T(1) - progress) + to * progress 70 | } 71 | 72 | public func sign(_ x: T) -> T where T == T.Magnitude { 73 | return x.sign 74 | } 75 | 76 | public func sign(_ x: T) -> T { 77 | return x.sign 78 | } 79 | 80 | public func min(_ t: (T, T)) -> T { 81 | return Swift.min(t.0, t.1) 82 | } 83 | 84 | public func max(_ t: (T, T)) -> T { 85 | return Swift.max(t.0, t.1) 86 | } 87 | 88 | public func ratio(_ x: T, min: T, max: T) -> T { 89 | return x.ratio(min: min, max: max) 90 | } 91 | 92 | public func clamp(_ x: T, min: T, max: T) -> T { 93 | return x.clamp(min: min, max: max) 94 | } 95 | -------------------------------------------------------------------------------- /SwiftyCore/SwiftyCore.h: -------------------------------------------------------------------------------- 1 | // 2 | // SwiftyCore.h 3 | // SwiftyCore 4 | // 5 | // Created by Agustín de Cabrera on 3/9/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | 11 | //! Project version number for SwiftyCore. 12 | FOUNDATION_EXPORT double SwiftyCoreVersionNumber; 13 | 14 | //! Project version string for SwiftyCore. 15 | FOUNDATION_EXPORT const unsigned char SwiftyCoreVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /SwiftyCore/UnsignedInteger+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UnsignedInteger+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Copyright © 2017 Agustín de Cabrera. All rights reserved. 6 | // 7 | 8 | extension UnsignedInteger { 9 | var sign: Self { 10 | return self == 0 ? 0 : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /SwiftyGeometry/CGFloatTuple.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CGFloatTuple.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | import CoreGraphics 10 | 11 | // MARK: - CGFloatTuple 12 | 13 | /// Type that can be serialized to a pair of CGFloat values 14 | public typealias CGFloatTuple = (CGFloat, CGFloat) 15 | public protocol CGFloatTupleConvertible { 16 | var tuple: CGFloatTuple { get } 17 | init(tuple: CGFloatTuple) 18 | 19 | // methods with default implementations 20 | init(_ other: T) 21 | } 22 | 23 | extension CGFloatTupleConvertible { 24 | public init(_ other: T) { 25 | self.init(tuple: other.tuple) 26 | } 27 | 28 | public func makeIterator() -> AnyIterator { 29 | return AnyIterator([tuple.0, tuple.1].makeIterator()) 30 | } 31 | 32 | public func max() -> CGFloat { 33 | return Swift.max(tuple.0, tuple.1) 34 | } 35 | 36 | public func min() -> CGFloat { 37 | return Swift.min(tuple.0, tuple.1) 38 | } 39 | } 40 | 41 | /// Functional methods used to apply transforms to a pair of floats 42 | extension CGFloatTupleConvertible { 43 | public func map(_ transform: (CGFloat) throws -> CGFloat) rethrows -> Self { 44 | let t = self.tuple 45 | let result = (try transform(t.0), 46 | try transform(t.1)) 47 | return Self(tuple: result) 48 | } 49 | 50 | public func merge(_ other: CGFloatTupleConvertible, _ transform: (CGFloat, CGFloat) throws -> CGFloat) rethrows -> Self { 51 | let (t0, t1) = (self.tuple, other.tuple) 52 | let result = (try transform(t0.0, t1.0), 53 | try transform(t0.1, t1.1)) 54 | return Self(tuple: result) 55 | } 56 | 57 | public func merge(_ others: [CGFloatTupleConvertible], _ transform: ([CGFloat]) throws -> CGFloat) rethrows -> Self { 58 | let tuples = [self.tuple] + others.map { $0.tuple } 59 | let result = (try transform(tuples.map { $0.0 }), 60 | try transform(tuples.map { $0.1 })) 61 | return Self(tuple: result) 62 | } 63 | } 64 | 65 | /// Operators that can be applied to a pair of CGFloatTupleConvertible objects 66 | /// Each operation will work on an element-by-element basis 67 | 68 | extension CGFloatTupleConvertible { 69 | public static func +(lhs: Self, rhs: T) -> Self { 70 | return lhs.merge(rhs, +) 71 | } 72 | public static func +=(lhs: inout Self, rhs: T) { 73 | lhs = lhs + rhs 74 | } 75 | 76 | public static func -(lhs: Self, rhs: T) -> Self { 77 | return lhs.merge(rhs, -) 78 | } 79 | public static func -=(lhs: inout Self, rhs: T) { 80 | lhs = lhs - rhs 81 | } 82 | 83 | public static func - (lhs: Self, rhs: CGFloat) -> Self { 84 | return lhs.map({ $0 - rhs }) 85 | } 86 | public static func -= (lhs: inout Self, rhs: CGFloat) { 87 | lhs = lhs - rhs 88 | } 89 | 90 | public static func *(lhs: Self, rhs: CGFloat) -> Self { 91 | return lhs.map { $0 * rhs } 92 | } 93 | public static func *=(lhs: inout Self, rhs: CGFloat) { 94 | lhs = lhs * rhs 95 | } 96 | 97 | public static func /(lhs: Self, rhs: CGFloat) -> Self { 98 | return lhs.map { $0 / rhs } 99 | } 100 | public static func /=(lhs: inout Self, rhs: CGFloat) { 101 | lhs = lhs / rhs 102 | } 103 | 104 | public static func *(lhs: Self, rhs: T) -> Self { 105 | return lhs.merge(rhs, *) 106 | } 107 | public static func *=(lhs: inout Self, rhs: T) { 108 | lhs = lhs * rhs 109 | } 110 | 111 | public static func /(lhs: Self, rhs: T) -> Self { 112 | return lhs.merge(rhs, /) 113 | } 114 | public static func /=(lhs: inout Self, rhs: T) { 115 | lhs = lhs / rhs 116 | } 117 | 118 | public static prefix func -(rhs: Self) -> Self { 119 | return rhs.map { -$0 } 120 | } 121 | } 122 | 123 | public func abs(_ x: T) -> T { 124 | return x.map { abs($0) } 125 | } 126 | 127 | public func clamp(_ x: T, min: CGFloatTupleConvertible, max: CGFloatTupleConvertible) -> T { 128 | return x.merge([min, max]) { 129 | clamp($0[0], min: $0[1], max: $0[2]) 130 | } 131 | } 132 | 133 | @available(*, deprecated) 134 | public func clamp(_ x: T, _ min: CGFloatTupleConvertible, _ max: CGFloatTupleConvertible) -> T { 135 | return clamp(x, min: min, max: max) 136 | } 137 | 138 | extension CGRect { 139 | /// Multiply the rect's origin and size by the given value 140 | public static func * (lhs: CGRect, rhs: U) -> CGRect { 141 | return CGRect(origin: lhs.origin * rhs, size: lhs.size * rhs) 142 | } 143 | /// Multiply the rect's origin and size by the given value 144 | public static func *= (lhs: inout CGRect, rhs: U) { 145 | lhs = lhs * rhs 146 | } 147 | } 148 | 149 | -------------------------------------------------------------------------------- /SwiftyGeometry/CGGeometry+CGFloatTuple.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CGGeometry+CGFloatTuple.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | import CoreGraphics 10 | 11 | /// CGPoint, CGVector and CGSize can be converted to a pair of floats. 12 | /// Conforming to CGFloatTupleConvertible allows using the operators defined above. 13 | 14 | extension CGPoint: CGFloatTupleConvertible { 15 | public var tuple: CGFloatTuple { return (x, y) } 16 | 17 | public init(tuple: CGFloatTuple) { 18 | self.init(x: tuple.0, y: tuple.1) 19 | } 20 | } 21 | 22 | extension CGSize: CGFloatTupleConvertible { 23 | public var tuple: CGFloatTuple { return (width, height) } 24 | 25 | public init(tuple: CGFloatTuple) { 26 | self.init(width: tuple.0, height: tuple.1) 27 | } 28 | } 29 | 30 | extension CGVector: CGFloatTupleConvertible { 31 | public var tuple: CGFloatTuple { return (dx, dy) } 32 | 33 | public init(tuple: CGFloatTuple) { 34 | self.init(dx: tuple.0, dy: tuple.1) 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /SwiftyGeometry/CGPoint+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CGPoint+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | import CoreGraphics 10 | 11 | // MARK: - CGPoint 12 | 13 | extension CGPoint { 14 | public func clamped(to rect: CGRect) -> CGPoint { 15 | return CGPoint( 16 | x: clamp(x, min: rect.minX, max: rect.maxX), 17 | y: clamp(y, min: rect.minY, max: rect.maxY) 18 | ) 19 | } 20 | 21 | public var length: CGFloat { 22 | return sqrt((x * x) + (y * y)) 23 | } 24 | 25 | public func distance(to point: CGPoint) -> CGFloat { 26 | return sqrt(distanceSquared(to: point)) 27 | } 28 | 29 | public func distanceSquared(to point: CGPoint) -> CGFloat { 30 | return ((x - point.x) * (x - point.x)) + 31 | ((y - point.y) * (y - point.y)) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /SwiftyGeometry/CGRect+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CGRect+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | import CoreGraphics 10 | 11 | // MARK: - CGRect 12 | 13 | extension CGRect { 14 | public init(_ values: (CGFloat, CGFloat, CGFloat, CGFloat)) { 15 | self.init(x: values.0, y: values.1, width: values.2, height: values.3) 16 | } 17 | 18 | public func clamped(to rect: CGRect) -> CGRect { 19 | if size.width > rect.size.width || size.height > rect.size.height { 20 | return CGRect.null 21 | } 22 | 23 | let newRect = CGRect(origin: rect.origin, size: rect.size - size) 24 | let newOrigin = origin.clamped(to: newRect) 25 | 26 | return CGRect(origin: newOrigin, size: size) 27 | } 28 | 29 | public init(origin: CGPoint, width: CGFloat, height: CGFloat) { 30 | self.init(x: origin.x, y: origin.y, width: width, height: height) 31 | } 32 | 33 | public init(x: CGFloat, y: CGFloat, size: CGSize) { 34 | self.init(x: x, y: y, width: size.width, height: size.height) 35 | } 36 | 37 | public var center: CGPoint { 38 | return CGPoint(x: midX, y: midY) 39 | } 40 | 41 | /// Add the given point to the rect's origin 42 | public static func + (lhs: CGRect, rhs: CGPoint) -> CGRect { 43 | return CGRect(origin: lhs.origin + rhs, size: lhs.size) 44 | } 45 | /// Add the given vector to the rect's origin 46 | public static func + (lhs: CGRect, rhs: CGVector) -> CGRect { 47 | return lhs + CGPoint(rhs) 48 | } 49 | /// Add the given size to the rect's size 50 | public static func + (lhs: CGRect, rhs: CGSize) -> CGRect { 51 | return CGRect(origin: lhs.origin, size: lhs.size + rhs) 52 | } 53 | 54 | /// Substract the given point to the rect's origin 55 | public static func - (lhs: CGRect, rhs: CGPoint) -> CGRect { 56 | return CGRect(origin: lhs.origin - rhs, size: lhs.size) 57 | } 58 | /// Substract the given vector to the rect's origin 59 | public static func - (lhs: CGRect, rhs: CGVector) -> CGRect { 60 | return lhs - CGPoint(rhs) 61 | } 62 | /// Substract the given size to the rect's size 63 | public static func - (lhs: CGRect, rhs: CGSize) -> CGRect { 64 | return CGRect(origin: lhs.origin, size: lhs.size - rhs) 65 | } 66 | 67 | /// Multiply the rect's origin and size by the given value 68 | public static func * (lhs: CGRect, rhs: CGFloat) -> CGRect { 69 | return CGRect(origin: lhs.origin * rhs, size: lhs.size * rhs) 70 | } 71 | /// Multiply the rect's origin and size by the given value 72 | public static func *= (lhs: inout CGRect, rhs: CGFloat) { 73 | lhs = lhs * rhs 74 | } 75 | } 76 | 77 | /// Interpolate between two rects 78 | public func lerp(_ from: CGRect, _ to: CGRect, _ progress: Double) -> CGRect { 79 | let progress = CGFloat(progress) 80 | return CGRect( 81 | x: lerp(from.origin.x, to.origin.x, progress), 82 | y: lerp(from.origin.y, to.origin.y, progress), 83 | width: lerp(from.size.width, to.size.width, progress), 84 | height: lerp(from.size.height, to.size.height, progress) 85 | ) 86 | } 87 | -------------------------------------------------------------------------------- /SwiftyGeometry/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /SwiftyGeometry/SwiftyGeometry.h: -------------------------------------------------------------------------------- 1 | // 2 | // SwiftyGeometry.h 3 | // SwiftyGeometry 4 | // 5 | // Created by Agustín de Cabrera on 3/9/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | @import SwiftyCore; 11 | 12 | //! Project version number for SwiftyGeometry. 13 | FOUNDATION_EXPORT double SwiftyGeometryVersionNumber; 14 | 15 | //! Project version string for SwiftyGeometry. 16 | FOUNDATION_EXPORT const unsigned char SwiftyGeometryVersionString[]; 17 | 18 | // In this header, you should import all the public headers of your framework using statements like #import 19 | 20 | 21 | -------------------------------------------------------------------------------- /SwiftyGeometry/UIEdgeInsets+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIEdgeInsets+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK: - UIEdgeInsets 12 | 13 | extension UIEdgeInsets { 14 | public var topLeft: CGPoint { 15 | return CGPoint(x: left, y: top) 16 | } 17 | public var bottomRight: CGPoint { 18 | return CGPoint(x: right, y: bottom) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SwiftySwift.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "SwiftySwift" 3 | s.version = "3.1.0" 4 | s.summary = "SwiftySwift is a collection of useful extensions for Swift types and Cocoa objects." 5 | s.homepage = "https://github.com/adeca/SwiftySwift" 6 | s.license = { :type => 'MIT' } 7 | s.authors = { "Agustin de Cabrera" => "agustindc@gmail.com" } 8 | s.source = { :git => "https://github.com/adeca/SwiftySwift.git", :tag => s.version.to_s } 9 | s.requires_arc = true 10 | s.platform = :ios, '8.0' 11 | s.ios.deployment_target = "8.0" 12 | 13 | s.pod_target_xcconfig = { 14 | 'SWIFT_VERSION' => '4.0', 15 | 'SWIFT_SWIFT3_OBJC_INFERENCE' => 'Off', 16 | } 17 | 18 | s.subspec 'Core' do |sub| 19 | sub.source_files = 'SwiftyCore/*.swift' 20 | end 21 | 22 | s.subspec 'Cocoa' do |sub| 23 | sub.source_files = 'SwiftyCocoa/*.swift' 24 | sub.dependency 'SwiftySwift/Core' 25 | end 26 | 27 | s.subspec 'Geometry' do |sub| 28 | sub.source_files = 'SwiftyGeometry/*.swift' 29 | sub.dependency 'SwiftySwift/Core' 30 | end 31 | 32 | s.subspec 'UIKit' do |sub| 33 | sub.source_files = 'SwiftyUIKit/*.swift' 34 | sub.dependency 'SwiftySwift/Cocoa' 35 | end 36 | 37 | s.subspec 'MultiRange' do |sub| 38 | sub.source_files = 'MultiRange/*.swift' 39 | end 40 | end 41 | -------------------------------------------------------------------------------- /SwiftySwift.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | E30DDF511C90E9C800FBC536 /* SwiftyCocoa.h in Headers */ = {isa = PBXBuildFile; fileRef = E30DDF501C90E9C800FBC536 /* SwiftyCocoa.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11 | E30DDF671C90EAD100FBC536 /* SwiftyCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E30DDF5D1C90EAA400FBC536 /* SwiftyCore.framework */; }; 12 | E30DDF951C90ECD700FBC536 /* SwiftyCocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E30DDF4E1C90E9C800FBC536 /* SwiftyCocoa.framework */; }; 13 | E30DDF961C90ECE200FBC536 /* SwiftyCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E30DDF5D1C90EAA400FBC536 /* SwiftyCore.framework */; }; 14 | E30DDFAC1C90EF7000FBC536 /* SwiftyCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E30DDF5D1C90EAA400FBC536 /* SwiftyCore.framework */; }; 15 | E30DDFAD1C90F2B500FBC536 /* SwiftyGeometry.h in Headers */ = {isa = PBXBuildFile; fileRef = E30DDF721C90EC5E00FBC536 /* SwiftyGeometry.h */; settings = {ATTRIBUTES = (Public, ); }; }; 16 | E30DDFAE1C90F2BE00FBC536 /* SwiftyCore.h in Headers */ = {isa = PBXBuildFile; fileRef = E30DDF5F1C90EAA400FBC536 /* SwiftyCore.h */; settings = {ATTRIBUTES = (Public, ); }; }; 17 | E30DDFAF1C90F2D000FBC536 /* SwiftyUIKit.h in Headers */ = {isa = PBXBuildFile; fileRef = E30DDF7F1C90EC6F00FBC536 /* SwiftyUIKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18 | E30DDFB01C90F2D400FBC536 /* MultiRange.h in Headers */ = {isa = PBXBuildFile; fileRef = E30DDF8C1C90EC7D00FBC536 /* MultiRange.h */; settings = {ATTRIBUTES = (Public, ); }; }; 19 | E34D11E11B1D032B000816A9 /* SwiftySwift.h in Headers */ = {isa = PBXBuildFile; fileRef = E34D11E01B1D032B000816A9 /* SwiftySwift.h */; settings = {ATTRIBUTES = (Public, ); }; }; 20 | E34D11E71B1D032B000816A9 /* SwiftySwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E34D11DB1B1D032B000816A9 /* SwiftySwift.framework */; }; 21 | E34D11EE1B1D032B000816A9 /* SwiftySwiftTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E34D11ED1B1D032B000816A9 /* SwiftySwiftTests.swift */; }; 22 | E3C7CBAA1F63205300719D0E /* FloatingPoint+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3C7CBA91F63205300719D0E /* FloatingPoint+Extensions.swift */; }; 23 | E3C7CBAB1F632D3100719D0E /* FloatingPoint+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3C7CBA91F63205300719D0E /* FloatingPoint+Extensions.swift */; }; 24 | E3C7CBAD1F632D9000719D0E /* SignedNumeric+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3C7CBAC1F632D9000719D0E /* SignedNumeric+Extensions.swift */; }; 25 | E3C7CBAE1F632D9000719D0E /* SignedNumeric+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3C7CBAC1F632D9000719D0E /* SignedNumeric+Extensions.swift */; }; 26 | E3C7CBB01F63331000719D0E /* UnsignedInteger+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3C7CBAF1F63331000719D0E /* UnsignedInteger+Extensions.swift */; }; 27 | E3C7CBB11F63331000719D0E /* UnsignedInteger+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3C7CBAF1F63331000719D0E /* UnsignedInteger+Extensions.swift */; }; 28 | E3C7CBB31F633AD300719D0E /* URL+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3C7CBB21F633AD300719D0E /* URL+Extensions.swift */; }; 29 | E3C7CBB41F633AD300719D0E /* URL+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3C7CBB21F633AD300719D0E /* URL+Extensions.swift */; }; 30 | E3D96D321CECF19500D58C9E /* UICollectionView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D291CECF19500D58C9E /* UICollectionView+Extensions.swift */; }; 31 | E3D96D331CECF19500D58C9E /* UICollectionView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D291CECF19500D58C9E /* UICollectionView+Extensions.swift */; }; 32 | E3D96D341CECF19500D58C9E /* UIColor+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D2A1CECF19500D58C9E /* UIColor+Extensions.swift */; }; 33 | E3D96D351CECF19500D58C9E /* UIColor+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D2A1CECF19500D58C9E /* UIColor+Extensions.swift */; }; 34 | E3D96D361CECF19500D58C9E /* UIFont+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D2B1CECF19500D58C9E /* UIFont+Extensions.swift */; }; 35 | E3D96D371CECF19500D58C9E /* UIFont+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D2B1CECF19500D58C9E /* UIFont+Extensions.swift */; }; 36 | E3D96D381CECF19500D58C9E /* UIGestureRecognizer+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D2C1CECF19500D58C9E /* UIGestureRecognizer+Extensions.swift */; }; 37 | E3D96D391CECF19500D58C9E /* UIGestureRecognizer+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D2C1CECF19500D58C9E /* UIGestureRecognizer+Extensions.swift */; }; 38 | E3D96D3A1CECF19500D58C9E /* UIImage+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D2D1CECF19500D58C9E /* UIImage+Extensions.swift */; }; 39 | E3D96D3B1CECF19500D58C9E /* UIImage+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D2D1CECF19500D58C9E /* UIImage+Extensions.swift */; }; 40 | E3D96D3C1CECF19500D58C9E /* UIImageView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D2E1CECF19500D58C9E /* UIImageView+Extensions.swift */; }; 41 | E3D96D3D1CECF19500D58C9E /* UIImageView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D2E1CECF19500D58C9E /* UIImageView+Extensions.swift */; }; 42 | E3D96D3E1CECF19500D58C9E /* UITableView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D2F1CECF19500D58C9E /* UITableView+Extensions.swift */; }; 43 | E3D96D3F1CECF19500D58C9E /* UITableView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D2F1CECF19500D58C9E /* UITableView+Extensions.swift */; }; 44 | E3D96D401CECF19500D58C9E /* UIView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D301CECF19500D58C9E /* UIView+Extensions.swift */; }; 45 | E3D96D411CECF19500D58C9E /* UIView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D301CECF19500D58C9E /* UIView+Extensions.swift */; }; 46 | E3D96D421CECF19500D58C9E /* UIViewController+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D311CECF19500D58C9E /* UIViewController+Extensions.swift */; }; 47 | E3D96D431CECF19500D58C9E /* UIViewController+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D311CECF19500D58C9E /* UIViewController+Extensions.swift */; }; 48 | E3D96D451CECF4DA00D58C9E /* CGPoint+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D441CECF4DA00D58C9E /* CGPoint+Extensions.swift */; }; 49 | E3D96D461CECF4DA00D58C9E /* CGPoint+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D441CECF4DA00D58C9E /* CGPoint+Extensions.swift */; }; 50 | E3D96D481CECF51400D58C9E /* UIEdgeInsets+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D471CECF51400D58C9E /* UIEdgeInsets+Extensions.swift */; }; 51 | E3D96D491CECF51400D58C9E /* UIEdgeInsets+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D471CECF51400D58C9E /* UIEdgeInsets+Extensions.swift */; }; 52 | E3D96D4B1CECF57C00D58C9E /* CGRect+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D4A1CECF57C00D58C9E /* CGRect+Extensions.swift */; }; 53 | E3D96D4C1CECF57C00D58C9E /* CGRect+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D4A1CECF57C00D58C9E /* CGRect+Extensions.swift */; }; 54 | E3D96D4E1CECF5AF00D58C9E /* CGFloatTuple.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D4D1CECF5AF00D58C9E /* CGFloatTuple.swift */; }; 55 | E3D96D4F1CECF5AF00D58C9E /* CGFloatTuple.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D4D1CECF5AF00D58C9E /* CGFloatTuple.swift */; }; 56 | E3D96D541CECF66700D58C9E /* CGGeometry+CGFloatTuple.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D531CECF66700D58C9E /* CGGeometry+CGFloatTuple.swift */; }; 57 | E3D96D551CECF66700D58C9E /* CGGeometry+CGFloatTuple.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D531CECF66700D58C9E /* CGGeometry+CGFloatTuple.swift */; }; 58 | E3D96D571CECF6B800D58C9E /* NSObject+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D561CECF6B800D58C9E /* NSObject+Extensions.swift */; }; 59 | E3D96D581CECF6B800D58C9E /* NSObject+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D561CECF6B800D58C9E /* NSObject+Extensions.swift */; }; 60 | E3D96D5A1CECF6D100D58C9E /* NSThread+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D591CECF6D100D58C9E /* NSThread+Extensions.swift */; }; 61 | E3D96D5B1CECF6D100D58C9E /* NSThread+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D591CECF6D100D58C9E /* NSThread+Extensions.swift */; }; 62 | E3D96D5D1CECF6EC00D58C9E /* NSLayoutConstraint+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D5C1CECF6EC00D58C9E /* NSLayoutConstraint+Extensions.swift */; }; 63 | E3D96D5E1CECF6EC00D58C9E /* NSLayoutConstraint+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D5C1CECF6EC00D58C9E /* NSLayoutConstraint+Extensions.swift */; }; 64 | E3D96D631CECF72F00D58C9E /* NSAttributedString+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D621CECF72F00D58C9E /* NSAttributedString+Extensions.swift */; }; 65 | E3D96D641CECF72F00D58C9E /* NSAttributedString+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D621CECF72F00D58C9E /* NSAttributedString+Extensions.swift */; }; 66 | E3D96D661CECF74200D58C9E /* NSNotificationCenter+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D651CECF74200D58C9E /* NSNotificationCenter+Extensions.swift */; }; 67 | E3D96D671CECF74200D58C9E /* NSNotificationCenter+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D651CECF74200D58C9E /* NSNotificationCenter+Extensions.swift */; }; 68 | E3D96D691CECF77300D58C9E /* Dispatch+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D681CECF77300D58C9E /* Dispatch+Extensions.swift */; }; 69 | E3D96D6A1CECF77300D58C9E /* Dispatch+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D681CECF77300D58C9E /* Dispatch+Extensions.swift */; }; 70 | E3D96D6C1CECF85300D58C9E /* SequenceType+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D6B1CECF85300D58C9E /* SequenceType+Extensions.swift */; }; 71 | E3D96D6D1CECF85300D58C9E /* SequenceType+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D6B1CECF85300D58C9E /* SequenceType+Extensions.swift */; }; 72 | E3D96D6F1CECF8B200D58C9E /* SortOrder.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D6E1CECF8B200D58C9E /* SortOrder.swift */; }; 73 | E3D96D701CECF8B200D58C9E /* SortOrder.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D6E1CECF8B200D58C9E /* SortOrder.swift */; }; 74 | E3D96D721CECF8E200D58C9E /* RangeReplaceableCollectionType+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D711CECF8E200D58C9E /* RangeReplaceableCollectionType+Extensions.swift */; }; 75 | E3D96D731CECF8E200D58C9E /* RangeReplaceableCollectionType+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D711CECF8E200D58C9E /* RangeReplaceableCollectionType+Extensions.swift */; }; 76 | E3D96D751CECF8F700D58C9E /* CollectionType+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D741CECF8F700D58C9E /* CollectionType+Extensions.swift */; }; 77 | E3D96D761CECF8F700D58C9E /* CollectionType+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D741CECF8F700D58C9E /* CollectionType+Extensions.swift */; }; 78 | E3D96D781CECF91300D58C9E /* Dictionary+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D771CECF91300D58C9E /* Dictionary+Extensions.swift */; }; 79 | E3D96D791CECF91300D58C9E /* Dictionary+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D771CECF91300D58C9E /* Dictionary+Extensions.swift */; }; 80 | E3D96D7B1CECF93E00D58C9E /* StringLiteralConvertible+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D7A1CECF93E00D58C9E /* StringLiteralConvertible+Extensions.swift */; }; 81 | E3D96D7C1CECF93E00D58C9E /* StringLiteralConvertible+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D7A1CECF93E00D58C9E /* StringLiteralConvertible+Extensions.swift */; }; 82 | E3D96D7E1CECF97200D58C9E /* Comparable+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D7D1CECF97200D58C9E /* Comparable+Extensions.swift */; }; 83 | E3D96D7F1CECF97200D58C9E /* Comparable+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D7D1CECF97200D58C9E /* Comparable+Extensions.swift */; }; 84 | E3D96D811CECF9AA00D58C9E /* OptionalConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D801CECF9AA00D58C9E /* OptionalConvertible.swift */; }; 85 | E3D96D821CECF9AA00D58C9E /* OptionalConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D801CECF9AA00D58C9E /* OptionalConvertible.swift */; }; 86 | E3D96D841CECF9D100D58C9E /* Optional+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D831CECF9D100D58C9E /* Optional+Extensions.swift */; }; 87 | E3D96D851CECF9D100D58C9E /* Optional+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D831CECF9D100D58C9E /* Optional+Extensions.swift */; }; 88 | E3D96D871CECF9F600D58C9E /* BinaryInteger+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D861CECF9F600D58C9E /* BinaryInteger+Extensions.swift */; }; 89 | E3D96D881CECF9F600D58C9E /* BinaryInteger+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D861CECF9F600D58C9E /* BinaryInteger+Extensions.swift */; }; 90 | E3D96D8A1CECFA5900D58C9E /* Swift+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D891CECFA5900D58C9E /* Swift+Extensions.swift */; }; 91 | E3D96D8B1CECFA5900D58C9E /* Swift+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D891CECFA5900D58C9E /* Swift+Extensions.swift */; }; 92 | E3D96D8D1CECFA7800D58C9E /* MultiRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D8C1CECFA7800D58C9E /* MultiRange.swift */; }; 93 | E3D96D8E1CECFA7800D58C9E /* MultiRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D96D8C1CECFA7800D58C9E /* MultiRange.swift */; }; 94 | /* End PBXBuildFile section */ 95 | 96 | /* Begin PBXContainerItemProxy section */ 97 | E30DDF9A1C90EF3A00FBC536 /* PBXContainerItemProxy */ = { 98 | isa = PBXContainerItemProxy; 99 | containerPortal = E34D11D21B1D032B000816A9 /* Project object */; 100 | proxyType = 1; 101 | remoteGlobalIDString = E30DDF5C1C90EAA400FBC536; 102 | remoteInfo = SwiftyCore; 103 | }; 104 | E30DDF9C1C90EF4000FBC536 /* PBXContainerItemProxy */ = { 105 | isa = PBXContainerItemProxy; 106 | containerPortal = E34D11D21B1D032B000816A9 /* Project object */; 107 | proxyType = 1; 108 | remoteGlobalIDString = E30DDF5C1C90EAA400FBC536; 109 | remoteInfo = SwiftyCore; 110 | }; 111 | E30DDF9E1C90EF4500FBC536 /* PBXContainerItemProxy */ = { 112 | isa = PBXContainerItemProxy; 113 | containerPortal = E34D11D21B1D032B000816A9 /* Project object */; 114 | proxyType = 1; 115 | remoteGlobalIDString = E30DDF5C1C90EAA400FBC536; 116 | remoteInfo = SwiftyCore; 117 | }; 118 | E30DDFA01C90EF4900FBC536 /* PBXContainerItemProxy */ = { 119 | isa = PBXContainerItemProxy; 120 | containerPortal = E34D11D21B1D032B000816A9 /* Project object */; 121 | proxyType = 1; 122 | remoteGlobalIDString = E30DDF4D1C90E9C800FBC536; 123 | remoteInfo = SwiftyCocoa; 124 | }; 125 | E30DDFA21C90EF5300FBC536 /* PBXContainerItemProxy */ = { 126 | isa = PBXContainerItemProxy; 127 | containerPortal = E34D11D21B1D032B000816A9 /* Project object */; 128 | proxyType = 1; 129 | remoteGlobalIDString = E30DDF4D1C90E9C800FBC536; 130 | remoteInfo = SwiftyCocoa; 131 | }; 132 | E30DDFA41C90EF5600FBC536 /* PBXContainerItemProxy */ = { 133 | isa = PBXContainerItemProxy; 134 | containerPortal = E34D11D21B1D032B000816A9 /* Project object */; 135 | proxyType = 1; 136 | remoteGlobalIDString = E30DDF5C1C90EAA400FBC536; 137 | remoteInfo = SwiftyCore; 138 | }; 139 | E30DDFA61C90EF5A00FBC536 /* PBXContainerItemProxy */ = { 140 | isa = PBXContainerItemProxy; 141 | containerPortal = E34D11D21B1D032B000816A9 /* Project object */; 142 | proxyType = 1; 143 | remoteGlobalIDString = E30DDF6F1C90EC5E00FBC536; 144 | remoteInfo = SwiftyGeometry; 145 | }; 146 | E30DDFA81C90EF5C00FBC536 /* PBXContainerItemProxy */ = { 147 | isa = PBXContainerItemProxy; 148 | containerPortal = E34D11D21B1D032B000816A9 /* Project object */; 149 | proxyType = 1; 150 | remoteGlobalIDString = E30DDF7C1C90EC6F00FBC536; 151 | remoteInfo = SwiftyUIKit; 152 | }; 153 | E30DDFAA1C90EF5F00FBC536 /* PBXContainerItemProxy */ = { 154 | isa = PBXContainerItemProxy; 155 | containerPortal = E34D11D21B1D032B000816A9 /* Project object */; 156 | proxyType = 1; 157 | remoteGlobalIDString = E30DDF891C90EC7D00FBC536; 158 | remoteInfo = MultiRange; 159 | }; 160 | E34D11E81B1D032B000816A9 /* PBXContainerItemProxy */ = { 161 | isa = PBXContainerItemProxy; 162 | containerPortal = E34D11D21B1D032B000816A9 /* Project object */; 163 | proxyType = 1; 164 | remoteGlobalIDString = E34D11DA1B1D032B000816A9; 165 | remoteInfo = SwiftySwift; 166 | }; 167 | /* End PBXContainerItemProxy section */ 168 | 169 | /* Begin PBXFileReference section */ 170 | E30DDF4E1C90E9C800FBC536 /* SwiftyCocoa.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftyCocoa.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 171 | E30DDF501C90E9C800FBC536 /* SwiftyCocoa.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SwiftyCocoa.h; sourceTree = ""; }; 172 | E30DDF521C90E9C800FBC536 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 173 | E30DDF5D1C90EAA400FBC536 /* SwiftyCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftyCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 174 | E30DDF5F1C90EAA400FBC536 /* SwiftyCore.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SwiftyCore.h; sourceTree = ""; }; 175 | E30DDF611C90EAA400FBC536 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 176 | E30DDF701C90EC5E00FBC536 /* SwiftyGeometry.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftyGeometry.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 177 | E30DDF721C90EC5E00FBC536 /* SwiftyGeometry.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SwiftyGeometry.h; sourceTree = ""; }; 178 | E30DDF741C90EC5E00FBC536 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 179 | E30DDF7D1C90EC6F00FBC536 /* SwiftyUIKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftyUIKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 180 | E30DDF7F1C90EC6F00FBC536 /* SwiftyUIKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SwiftyUIKit.h; sourceTree = ""; }; 181 | E30DDF811C90EC6F00FBC536 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 182 | E30DDF8A1C90EC7D00FBC536 /* MultiRange.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MultiRange.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 183 | E30DDF8C1C90EC7D00FBC536 /* MultiRange.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MultiRange.h; sourceTree = ""; }; 184 | E30DDF8E1C90EC7D00FBC536 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 185 | E34D11DB1B1D032B000816A9 /* SwiftySwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftySwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 186 | E34D11DF1B1D032B000816A9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 187 | E34D11E01B1D032B000816A9 /* SwiftySwift.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SwiftySwift.h; sourceTree = ""; }; 188 | E34D11E61B1D032B000816A9 /* SwiftySwiftTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SwiftySwiftTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 189 | E34D11EC1B1D032B000816A9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 190 | E34D11ED1B1D032B000816A9 /* SwiftySwiftTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftySwiftTests.swift; sourceTree = ""; }; 191 | E36EDC201EF1DD3200432A23 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 192 | E3A5D2671BE04374002067C2 /* SwiftySwift.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; path = SwiftySwift.podspec; sourceTree = SOURCE_ROOT; }; 193 | E3C7CBA91F63205300719D0E /* FloatingPoint+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FloatingPoint+Extensions.swift"; sourceTree = ""; }; 194 | E3C7CBAC1F632D9000719D0E /* SignedNumeric+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SignedNumeric+Extensions.swift"; sourceTree = ""; }; 195 | E3C7CBAF1F63331000719D0E /* UnsignedInteger+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UnsignedInteger+Extensions.swift"; sourceTree = ""; }; 196 | E3C7CBB21F633AD300719D0E /* URL+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URL+Extensions.swift"; sourceTree = ""; }; 197 | E3D96D291CECF19500D58C9E /* UICollectionView+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UICollectionView+Extensions.swift"; sourceTree = ""; }; 198 | E3D96D2A1CECF19500D58C9E /* UIColor+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIColor+Extensions.swift"; sourceTree = ""; }; 199 | E3D96D2B1CECF19500D58C9E /* UIFont+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIFont+Extensions.swift"; sourceTree = ""; }; 200 | E3D96D2C1CECF19500D58C9E /* UIGestureRecognizer+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIGestureRecognizer+Extensions.swift"; sourceTree = ""; }; 201 | E3D96D2D1CECF19500D58C9E /* UIImage+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIImage+Extensions.swift"; sourceTree = ""; }; 202 | E3D96D2E1CECF19500D58C9E /* UIImageView+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIImageView+Extensions.swift"; sourceTree = ""; }; 203 | E3D96D2F1CECF19500D58C9E /* UITableView+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UITableView+Extensions.swift"; sourceTree = ""; }; 204 | E3D96D301CECF19500D58C9E /* UIView+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIView+Extensions.swift"; sourceTree = ""; }; 205 | E3D96D311CECF19500D58C9E /* UIViewController+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIViewController+Extensions.swift"; sourceTree = ""; }; 206 | E3D96D441CECF4DA00D58C9E /* CGPoint+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CGPoint+Extensions.swift"; sourceTree = ""; }; 207 | E3D96D471CECF51400D58C9E /* UIEdgeInsets+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIEdgeInsets+Extensions.swift"; sourceTree = ""; }; 208 | E3D96D4A1CECF57C00D58C9E /* CGRect+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CGRect+Extensions.swift"; sourceTree = ""; }; 209 | E3D96D4D1CECF5AF00D58C9E /* CGFloatTuple.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CGFloatTuple.swift; sourceTree = ""; }; 210 | E3D96D531CECF66700D58C9E /* CGGeometry+CGFloatTuple.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CGGeometry+CGFloatTuple.swift"; sourceTree = ""; }; 211 | E3D96D561CECF6B800D58C9E /* NSObject+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSObject+Extensions.swift"; sourceTree = ""; }; 212 | E3D96D591CECF6D100D58C9E /* NSThread+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSThread+Extensions.swift"; sourceTree = ""; }; 213 | E3D96D5C1CECF6EC00D58C9E /* NSLayoutConstraint+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSLayoutConstraint+Extensions.swift"; sourceTree = ""; }; 214 | E3D96D621CECF72F00D58C9E /* NSAttributedString+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSAttributedString+Extensions.swift"; sourceTree = ""; }; 215 | E3D96D651CECF74200D58C9E /* NSNotificationCenter+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSNotificationCenter+Extensions.swift"; sourceTree = ""; }; 216 | E3D96D681CECF77300D58C9E /* Dispatch+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Dispatch+Extensions.swift"; sourceTree = ""; }; 217 | E3D96D6B1CECF85300D58C9E /* SequenceType+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SequenceType+Extensions.swift"; sourceTree = ""; }; 218 | E3D96D6E1CECF8B200D58C9E /* SortOrder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SortOrder.swift; sourceTree = ""; }; 219 | E3D96D711CECF8E200D58C9E /* RangeReplaceableCollectionType+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "RangeReplaceableCollectionType+Extensions.swift"; sourceTree = ""; }; 220 | E3D96D741CECF8F700D58C9E /* CollectionType+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CollectionType+Extensions.swift"; sourceTree = ""; }; 221 | E3D96D771CECF91300D58C9E /* Dictionary+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Dictionary+Extensions.swift"; sourceTree = ""; }; 222 | E3D96D7A1CECF93E00D58C9E /* StringLiteralConvertible+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "StringLiteralConvertible+Extensions.swift"; sourceTree = ""; }; 223 | E3D96D7D1CECF97200D58C9E /* Comparable+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Comparable+Extensions.swift"; sourceTree = ""; }; 224 | E3D96D801CECF9AA00D58C9E /* OptionalConvertible.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OptionalConvertible.swift; sourceTree = ""; }; 225 | E3D96D831CECF9D100D58C9E /* Optional+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Optional+Extensions.swift"; sourceTree = ""; }; 226 | E3D96D861CECF9F600D58C9E /* BinaryInteger+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "BinaryInteger+Extensions.swift"; sourceTree = ""; }; 227 | E3D96D891CECFA5900D58C9E /* Swift+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Swift+Extensions.swift"; sourceTree = ""; }; 228 | E3D96D8C1CECFA7800D58C9E /* MultiRange.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultiRange.swift; sourceTree = ""; }; 229 | /* End PBXFileReference section */ 230 | 231 | /* Begin PBXFrameworksBuildPhase section */ 232 | E30DDF4A1C90E9C800FBC536 /* Frameworks */ = { 233 | isa = PBXFrameworksBuildPhase; 234 | buildActionMask = 2147483647; 235 | files = ( 236 | E30DDF671C90EAD100FBC536 /* SwiftyCore.framework in Frameworks */, 237 | ); 238 | runOnlyForDeploymentPostprocessing = 0; 239 | }; 240 | E30DDF591C90EAA400FBC536 /* Frameworks */ = { 241 | isa = PBXFrameworksBuildPhase; 242 | buildActionMask = 2147483647; 243 | files = ( 244 | ); 245 | runOnlyForDeploymentPostprocessing = 0; 246 | }; 247 | E30DDF6C1C90EC5E00FBC536 /* Frameworks */ = { 248 | isa = PBXFrameworksBuildPhase; 249 | buildActionMask = 2147483647; 250 | files = ( 251 | E30DDF961C90ECE200FBC536 /* SwiftyCore.framework in Frameworks */, 252 | ); 253 | runOnlyForDeploymentPostprocessing = 0; 254 | }; 255 | E30DDF791C90EC6F00FBC536 /* Frameworks */ = { 256 | isa = PBXFrameworksBuildPhase; 257 | buildActionMask = 2147483647; 258 | files = ( 259 | E30DDFAC1C90EF7000FBC536 /* SwiftyCore.framework in Frameworks */, 260 | E30DDF951C90ECD700FBC536 /* SwiftyCocoa.framework in Frameworks */, 261 | ); 262 | runOnlyForDeploymentPostprocessing = 0; 263 | }; 264 | E30DDF861C90EC7D00FBC536 /* Frameworks */ = { 265 | isa = PBXFrameworksBuildPhase; 266 | buildActionMask = 2147483647; 267 | files = ( 268 | ); 269 | runOnlyForDeploymentPostprocessing = 0; 270 | }; 271 | E34D11D71B1D032B000816A9 /* Frameworks */ = { 272 | isa = PBXFrameworksBuildPhase; 273 | buildActionMask = 2147483647; 274 | files = ( 275 | ); 276 | runOnlyForDeploymentPostprocessing = 0; 277 | }; 278 | E34D11E31B1D032B000816A9 /* Frameworks */ = { 279 | isa = PBXFrameworksBuildPhase; 280 | buildActionMask = 2147483647; 281 | files = ( 282 | E34D11E71B1D032B000816A9 /* SwiftySwift.framework in Frameworks */, 283 | ); 284 | runOnlyForDeploymentPostprocessing = 0; 285 | }; 286 | /* End PBXFrameworksBuildPhase section */ 287 | 288 | /* Begin PBXGroup section */ 289 | E30DDF4F1C90E9C800FBC536 /* SwiftyCocoa */ = { 290 | isa = PBXGroup; 291 | children = ( 292 | E3D96D561CECF6B800D58C9E /* NSObject+Extensions.swift */, 293 | E3D96D591CECF6D100D58C9E /* NSThread+Extensions.swift */, 294 | E3D96D5C1CECF6EC00D58C9E /* NSLayoutConstraint+Extensions.swift */, 295 | E3D96D621CECF72F00D58C9E /* NSAttributedString+Extensions.swift */, 296 | E3D96D651CECF74200D58C9E /* NSNotificationCenter+Extensions.swift */, 297 | E3D96D681CECF77300D58C9E /* Dispatch+Extensions.swift */, 298 | E3C7CBB21F633AD300719D0E /* URL+Extensions.swift */, 299 | E30DDF501C90E9C800FBC536 /* SwiftyCocoa.h */, 300 | E30DDF521C90E9C800FBC536 /* Info.plist */, 301 | ); 302 | path = SwiftyCocoa; 303 | sourceTree = ""; 304 | }; 305 | E30DDF5E1C90EAA400FBC536 /* SwiftyCore */ = { 306 | isa = PBXGroup; 307 | children = ( 308 | E3D96D891CECFA5900D58C9E /* Swift+Extensions.swift */, 309 | E3D96D6B1CECF85300D58C9E /* SequenceType+Extensions.swift */, 310 | E3D96D6E1CECF8B200D58C9E /* SortOrder.swift */, 311 | E3D96D711CECF8E200D58C9E /* RangeReplaceableCollectionType+Extensions.swift */, 312 | E3D96D741CECF8F700D58C9E /* CollectionType+Extensions.swift */, 313 | E3D96D771CECF91300D58C9E /* Dictionary+Extensions.swift */, 314 | E3D96D7A1CECF93E00D58C9E /* StringLiteralConvertible+Extensions.swift */, 315 | E3D96D7D1CECF97200D58C9E /* Comparable+Extensions.swift */, 316 | E3D96D801CECF9AA00D58C9E /* OptionalConvertible.swift */, 317 | E3D96D831CECF9D100D58C9E /* Optional+Extensions.swift */, 318 | E3D96D861CECF9F600D58C9E /* BinaryInteger+Extensions.swift */, 319 | E3C7CBA91F63205300719D0E /* FloatingPoint+Extensions.swift */, 320 | E3C7CBAC1F632D9000719D0E /* SignedNumeric+Extensions.swift */, 321 | E3C7CBAF1F63331000719D0E /* UnsignedInteger+Extensions.swift */, 322 | E30DDF5F1C90EAA400FBC536 /* SwiftyCore.h */, 323 | E30DDF611C90EAA400FBC536 /* Info.plist */, 324 | ); 325 | path = SwiftyCore; 326 | sourceTree = ""; 327 | }; 328 | E30DDF711C90EC5E00FBC536 /* SwiftyGeometry */ = { 329 | isa = PBXGroup; 330 | children = ( 331 | E3D96D441CECF4DA00D58C9E /* CGPoint+Extensions.swift */, 332 | E3D96D471CECF51400D58C9E /* UIEdgeInsets+Extensions.swift */, 333 | E3D96D4A1CECF57C00D58C9E /* CGRect+Extensions.swift */, 334 | E3D96D4D1CECF5AF00D58C9E /* CGFloatTuple.swift */, 335 | E3D96D531CECF66700D58C9E /* CGGeometry+CGFloatTuple.swift */, 336 | E30DDF721C90EC5E00FBC536 /* SwiftyGeometry.h */, 337 | E30DDF741C90EC5E00FBC536 /* Info.plist */, 338 | ); 339 | path = SwiftyGeometry; 340 | sourceTree = ""; 341 | }; 342 | E30DDF7E1C90EC6F00FBC536 /* SwiftyUIKit */ = { 343 | isa = PBXGroup; 344 | children = ( 345 | E3D96D291CECF19500D58C9E /* UICollectionView+Extensions.swift */, 346 | E3D96D2A1CECF19500D58C9E /* UIColor+Extensions.swift */, 347 | E3D96D2B1CECF19500D58C9E /* UIFont+Extensions.swift */, 348 | E3D96D2C1CECF19500D58C9E /* UIGestureRecognizer+Extensions.swift */, 349 | E3D96D2D1CECF19500D58C9E /* UIImage+Extensions.swift */, 350 | E3D96D2E1CECF19500D58C9E /* UIImageView+Extensions.swift */, 351 | E3D96D2F1CECF19500D58C9E /* UITableView+Extensions.swift */, 352 | E3D96D301CECF19500D58C9E /* UIView+Extensions.swift */, 353 | E3D96D311CECF19500D58C9E /* UIViewController+Extensions.swift */, 354 | E30DDF7F1C90EC6F00FBC536 /* SwiftyUIKit.h */, 355 | E30DDF811C90EC6F00FBC536 /* Info.plist */, 356 | ); 357 | path = SwiftyUIKit; 358 | sourceTree = ""; 359 | }; 360 | E30DDF8B1C90EC7D00FBC536 /* MultiRange */ = { 361 | isa = PBXGroup; 362 | children = ( 363 | E3D96D8C1CECFA7800D58C9E /* MultiRange.swift */, 364 | E30DDF8C1C90EC7D00FBC536 /* MultiRange.h */, 365 | E30DDF8E1C90EC7D00FBC536 /* Info.plist */, 366 | ); 367 | path = MultiRange; 368 | sourceTree = ""; 369 | }; 370 | E34D11D11B1D032B000816A9 = { 371 | isa = PBXGroup; 372 | children = ( 373 | E36EDC201EF1DD3200432A23 /* README.md */, 374 | E34D11DD1B1D032B000816A9 /* SwiftySwift */, 375 | E30DDF5E1C90EAA400FBC536 /* SwiftyCore */, 376 | E30DDF4F1C90E9C800FBC536 /* SwiftyCocoa */, 377 | E30DDF711C90EC5E00FBC536 /* SwiftyGeometry */, 378 | E30DDF7E1C90EC6F00FBC536 /* SwiftyUIKit */, 379 | E30DDF8B1C90EC7D00FBC536 /* MultiRange */, 380 | E34D11EA1B1D032B000816A9 /* SwiftySwiftTests */, 381 | E34D11DC1B1D032B000816A9 /* Products */, 382 | ); 383 | sourceTree = ""; 384 | }; 385 | E34D11DC1B1D032B000816A9 /* Products */ = { 386 | isa = PBXGroup; 387 | children = ( 388 | E34D11DB1B1D032B000816A9 /* SwiftySwift.framework */, 389 | E34D11E61B1D032B000816A9 /* SwiftySwiftTests.xctest */, 390 | E30DDF4E1C90E9C800FBC536 /* SwiftyCocoa.framework */, 391 | E30DDF5D1C90EAA400FBC536 /* SwiftyCore.framework */, 392 | E30DDF701C90EC5E00FBC536 /* SwiftyGeometry.framework */, 393 | E30DDF7D1C90EC6F00FBC536 /* SwiftyUIKit.framework */, 394 | E30DDF8A1C90EC7D00FBC536 /* MultiRange.framework */, 395 | ); 396 | name = Products; 397 | sourceTree = ""; 398 | }; 399 | E34D11DD1B1D032B000816A9 /* SwiftySwift */ = { 400 | isa = PBXGroup; 401 | children = ( 402 | E34D11E01B1D032B000816A9 /* SwiftySwift.h */, 403 | E3A5D2671BE04374002067C2 /* SwiftySwift.podspec */, 404 | E34D11DF1B1D032B000816A9 /* Info.plist */, 405 | ); 406 | path = SwiftySwift; 407 | sourceTree = ""; 408 | }; 409 | E34D11EA1B1D032B000816A9 /* SwiftySwiftTests */ = { 410 | isa = PBXGroup; 411 | children = ( 412 | E34D11ED1B1D032B000816A9 /* SwiftySwiftTests.swift */, 413 | E34D11EC1B1D032B000816A9 /* Info.plist */, 414 | ); 415 | path = SwiftySwiftTests; 416 | sourceTree = ""; 417 | }; 418 | /* End PBXGroup section */ 419 | 420 | /* Begin PBXHeadersBuildPhase section */ 421 | E30DDF4B1C90E9C800FBC536 /* Headers */ = { 422 | isa = PBXHeadersBuildPhase; 423 | buildActionMask = 2147483647; 424 | files = ( 425 | E30DDF511C90E9C800FBC536 /* SwiftyCocoa.h in Headers */, 426 | ); 427 | runOnlyForDeploymentPostprocessing = 0; 428 | }; 429 | E30DDF5A1C90EAA400FBC536 /* Headers */ = { 430 | isa = PBXHeadersBuildPhase; 431 | buildActionMask = 2147483647; 432 | files = ( 433 | E30DDFAE1C90F2BE00FBC536 /* SwiftyCore.h in Headers */, 434 | ); 435 | runOnlyForDeploymentPostprocessing = 0; 436 | }; 437 | E30DDF6D1C90EC5E00FBC536 /* Headers */ = { 438 | isa = PBXHeadersBuildPhase; 439 | buildActionMask = 2147483647; 440 | files = ( 441 | E30DDFAD1C90F2B500FBC536 /* SwiftyGeometry.h in Headers */, 442 | ); 443 | runOnlyForDeploymentPostprocessing = 0; 444 | }; 445 | E30DDF7A1C90EC6F00FBC536 /* Headers */ = { 446 | isa = PBXHeadersBuildPhase; 447 | buildActionMask = 2147483647; 448 | files = ( 449 | E30DDFAF1C90F2D000FBC536 /* SwiftyUIKit.h in Headers */, 450 | ); 451 | runOnlyForDeploymentPostprocessing = 0; 452 | }; 453 | E30DDF871C90EC7D00FBC536 /* Headers */ = { 454 | isa = PBXHeadersBuildPhase; 455 | buildActionMask = 2147483647; 456 | files = ( 457 | E30DDFB01C90F2D400FBC536 /* MultiRange.h in Headers */, 458 | ); 459 | runOnlyForDeploymentPostprocessing = 0; 460 | }; 461 | E34D11D81B1D032B000816A9 /* Headers */ = { 462 | isa = PBXHeadersBuildPhase; 463 | buildActionMask = 2147483647; 464 | files = ( 465 | E34D11E11B1D032B000816A9 /* SwiftySwift.h in Headers */, 466 | ); 467 | runOnlyForDeploymentPostprocessing = 0; 468 | }; 469 | /* End PBXHeadersBuildPhase section */ 470 | 471 | /* Begin PBXNativeTarget section */ 472 | E30DDF4D1C90E9C800FBC536 /* SwiftyCocoa */ = { 473 | isa = PBXNativeTarget; 474 | buildConfigurationList = E30DDF551C90E9C800FBC536 /* Build configuration list for PBXNativeTarget "SwiftyCocoa" */; 475 | buildPhases = ( 476 | E30DDF491C90E9C800FBC536 /* Sources */, 477 | E30DDF4A1C90E9C800FBC536 /* Frameworks */, 478 | E30DDF4B1C90E9C800FBC536 /* Headers */, 479 | E30DDF4C1C90E9C800FBC536 /* Resources */, 480 | ); 481 | buildRules = ( 482 | ); 483 | dependencies = ( 484 | E30DDF9D1C90EF4000FBC536 /* PBXTargetDependency */, 485 | ); 486 | name = SwiftyCocoa; 487 | productName = SwiftyCocoa; 488 | productReference = E30DDF4E1C90E9C800FBC536 /* SwiftyCocoa.framework */; 489 | productType = "com.apple.product-type.framework"; 490 | }; 491 | E30DDF5C1C90EAA400FBC536 /* SwiftyCore */ = { 492 | isa = PBXNativeTarget; 493 | buildConfigurationList = E30DDF621C90EAA400FBC536 /* Build configuration list for PBXNativeTarget "SwiftyCore" */; 494 | buildPhases = ( 495 | E30DDF581C90EAA400FBC536 /* Sources */, 496 | E30DDF591C90EAA400FBC536 /* Frameworks */, 497 | E30DDF5A1C90EAA400FBC536 /* Headers */, 498 | E30DDF5B1C90EAA400FBC536 /* Resources */, 499 | ); 500 | buildRules = ( 501 | ); 502 | dependencies = ( 503 | ); 504 | name = SwiftyCore; 505 | productName = SwiftyCore; 506 | productReference = E30DDF5D1C90EAA400FBC536 /* SwiftyCore.framework */; 507 | productType = "com.apple.product-type.framework"; 508 | }; 509 | E30DDF6F1C90EC5E00FBC536 /* SwiftyGeometry */ = { 510 | isa = PBXNativeTarget; 511 | buildConfigurationList = E30DDF751C90EC5E00FBC536 /* Build configuration list for PBXNativeTarget "SwiftyGeometry" */; 512 | buildPhases = ( 513 | E30DDF6B1C90EC5E00FBC536 /* Sources */, 514 | E30DDF6C1C90EC5E00FBC536 /* Frameworks */, 515 | E30DDF6D1C90EC5E00FBC536 /* Headers */, 516 | E30DDF6E1C90EC5E00FBC536 /* Resources */, 517 | ); 518 | buildRules = ( 519 | ); 520 | dependencies = ( 521 | E30DDF9B1C90EF3A00FBC536 /* PBXTargetDependency */, 522 | ); 523 | name = SwiftyGeometry; 524 | productName = SwiftyGeometry; 525 | productReference = E30DDF701C90EC5E00FBC536 /* SwiftyGeometry.framework */; 526 | productType = "com.apple.product-type.framework"; 527 | }; 528 | E30DDF7C1C90EC6F00FBC536 /* SwiftyUIKit */ = { 529 | isa = PBXNativeTarget; 530 | buildConfigurationList = E30DDF821C90EC6F00FBC536 /* Build configuration list for PBXNativeTarget "SwiftyUIKit" */; 531 | buildPhases = ( 532 | E30DDF781C90EC6F00FBC536 /* Sources */, 533 | E30DDF791C90EC6F00FBC536 /* Frameworks */, 534 | E30DDF7A1C90EC6F00FBC536 /* Headers */, 535 | E30DDF7B1C90EC6F00FBC536 /* Resources */, 536 | ); 537 | buildRules = ( 538 | ); 539 | dependencies = ( 540 | E30DDFA11C90EF4900FBC536 /* PBXTargetDependency */, 541 | E30DDF9F1C90EF4500FBC536 /* PBXTargetDependency */, 542 | ); 543 | name = SwiftyUIKit; 544 | productName = SwiftyUIKit; 545 | productReference = E30DDF7D1C90EC6F00FBC536 /* SwiftyUIKit.framework */; 546 | productType = "com.apple.product-type.framework"; 547 | }; 548 | E30DDF891C90EC7D00FBC536 /* MultiRange */ = { 549 | isa = PBXNativeTarget; 550 | buildConfigurationList = E30DDF8F1C90EC7D00FBC536 /* Build configuration list for PBXNativeTarget "MultiRange" */; 551 | buildPhases = ( 552 | E30DDF851C90EC7D00FBC536 /* Sources */, 553 | E30DDF861C90EC7D00FBC536 /* Frameworks */, 554 | E30DDF871C90EC7D00FBC536 /* Headers */, 555 | E30DDF881C90EC7D00FBC536 /* Resources */, 556 | ); 557 | buildRules = ( 558 | ); 559 | dependencies = ( 560 | ); 561 | name = MultiRange; 562 | productName = MultiRange; 563 | productReference = E30DDF8A1C90EC7D00FBC536 /* MultiRange.framework */; 564 | productType = "com.apple.product-type.framework"; 565 | }; 566 | E34D11DA1B1D032B000816A9 /* SwiftySwift */ = { 567 | isa = PBXNativeTarget; 568 | buildConfigurationList = E34D11F11B1D032B000816A9 /* Build configuration list for PBXNativeTarget "SwiftySwift" */; 569 | buildPhases = ( 570 | E34D11D61B1D032B000816A9 /* Sources */, 571 | E34D11D71B1D032B000816A9 /* Frameworks */, 572 | E34D11D81B1D032B000816A9 /* Headers */, 573 | E34D11D91B1D032B000816A9 /* Resources */, 574 | ); 575 | buildRules = ( 576 | ); 577 | dependencies = ( 578 | E30DDFAB1C90EF5F00FBC536 /* PBXTargetDependency */, 579 | E30DDFA91C90EF5C00FBC536 /* PBXTargetDependency */, 580 | E30DDFA71C90EF5A00FBC536 /* PBXTargetDependency */, 581 | E30DDFA31C90EF5300FBC536 /* PBXTargetDependency */, 582 | E30DDFA51C90EF5600FBC536 /* PBXTargetDependency */, 583 | ); 584 | name = SwiftySwift; 585 | productName = SwiftySwift; 586 | productReference = E34D11DB1B1D032B000816A9 /* SwiftySwift.framework */; 587 | productType = "com.apple.product-type.framework"; 588 | }; 589 | E34D11E51B1D032B000816A9 /* SwiftySwiftTests */ = { 590 | isa = PBXNativeTarget; 591 | buildConfigurationList = E34D11F41B1D032B000816A9 /* Build configuration list for PBXNativeTarget "SwiftySwiftTests" */; 592 | buildPhases = ( 593 | E34D11E21B1D032B000816A9 /* Sources */, 594 | E34D11E31B1D032B000816A9 /* Frameworks */, 595 | E34D11E41B1D032B000816A9 /* Resources */, 596 | ); 597 | buildRules = ( 598 | ); 599 | dependencies = ( 600 | E34D11E91B1D032B000816A9 /* PBXTargetDependency */, 601 | ); 602 | name = SwiftySwiftTests; 603 | productName = SwiftySwiftTests; 604 | productReference = E34D11E61B1D032B000816A9 /* SwiftySwiftTests.xctest */; 605 | productType = "com.apple.product-type.bundle.unit-test"; 606 | }; 607 | /* End PBXNativeTarget section */ 608 | 609 | /* Begin PBXProject section */ 610 | E34D11D21B1D032B000816A9 /* Project object */ = { 611 | isa = PBXProject; 612 | attributes = { 613 | LastSwiftUpdateCheck = 0730; 614 | LastUpgradeCheck = 0700; 615 | ORGANIZATIONNAME = "Agustín de Cabrera"; 616 | TargetAttributes = { 617 | E30DDF4D1C90E9C800FBC536 = { 618 | CreatedOnToolsVersion = 7.2; 619 | DevelopmentTeam = 8SZVBV2U3L; 620 | DevelopmentTeamName = "Agustin de Cabrera (Personal Team)"; 621 | LastSwiftMigration = 0900; 622 | ProvisioningStyle = Automatic; 623 | }; 624 | E30DDF5C1C90EAA400FBC536 = { 625 | CreatedOnToolsVersion = 7.2; 626 | DevelopmentTeam = 8SZVBV2U3L; 627 | DevelopmentTeamName = "Agustin de Cabrera (Personal Team)"; 628 | LastSwiftMigration = 0900; 629 | ProvisioningStyle = Automatic; 630 | }; 631 | E30DDF6F1C90EC5E00FBC536 = { 632 | CreatedOnToolsVersion = 7.2; 633 | DevelopmentTeam = 8SZVBV2U3L; 634 | DevelopmentTeamName = "Agustin de Cabrera (Personal Team)"; 635 | LastSwiftMigration = 0900; 636 | ProvisioningStyle = Automatic; 637 | }; 638 | E30DDF7C1C90EC6F00FBC536 = { 639 | CreatedOnToolsVersion = 7.2; 640 | DevelopmentTeam = 8SZVBV2U3L; 641 | DevelopmentTeamName = "Agustin de Cabrera (Personal Team)"; 642 | LastSwiftMigration = 0900; 643 | ProvisioningStyle = Automatic; 644 | }; 645 | E30DDF891C90EC7D00FBC536 = { 646 | CreatedOnToolsVersion = 7.2; 647 | DevelopmentTeam = 8SZVBV2U3L; 648 | DevelopmentTeamName = "Agustin de Cabrera (Personal Team)"; 649 | LastSwiftMigration = 0900; 650 | ProvisioningStyle = Automatic; 651 | }; 652 | E34D11DA1B1D032B000816A9 = { 653 | CreatedOnToolsVersion = 6.3.2; 654 | DevelopmentTeam = 8SZVBV2U3L; 655 | DevelopmentTeamName = "Agustin de Cabrera (Personal Team)"; 656 | LastSwiftMigration = 0900; 657 | ProvisioningStyle = Automatic; 658 | }; 659 | E34D11E51B1D032B000816A9 = { 660 | CreatedOnToolsVersion = 6.3.2; 661 | DevelopmentTeam = 8SZVBV2U3L; 662 | DevelopmentTeamName = "Agustin de Cabrera (Personal Team)"; 663 | LastSwiftMigration = 0900; 664 | ProvisioningStyle = Automatic; 665 | }; 666 | }; 667 | }; 668 | buildConfigurationList = E34D11D51B1D032B000816A9 /* Build configuration list for PBXProject "SwiftySwift" */; 669 | compatibilityVersion = "Xcode 3.2"; 670 | developmentRegion = English; 671 | hasScannedForEncodings = 0; 672 | knownRegions = ( 673 | en, 674 | ); 675 | mainGroup = E34D11D11B1D032B000816A9; 676 | productRefGroup = E34D11DC1B1D032B000816A9 /* Products */; 677 | projectDirPath = ""; 678 | projectRoot = ""; 679 | targets = ( 680 | E34D11DA1B1D032B000816A9 /* SwiftySwift */, 681 | E34D11E51B1D032B000816A9 /* SwiftySwiftTests */, 682 | E30DDF4D1C90E9C800FBC536 /* SwiftyCocoa */, 683 | E30DDF5C1C90EAA400FBC536 /* SwiftyCore */, 684 | E30DDF6F1C90EC5E00FBC536 /* SwiftyGeometry */, 685 | E30DDF7C1C90EC6F00FBC536 /* SwiftyUIKit */, 686 | E30DDF891C90EC7D00FBC536 /* MultiRange */, 687 | ); 688 | }; 689 | /* End PBXProject section */ 690 | 691 | /* Begin PBXResourcesBuildPhase section */ 692 | E30DDF4C1C90E9C800FBC536 /* Resources */ = { 693 | isa = PBXResourcesBuildPhase; 694 | buildActionMask = 2147483647; 695 | files = ( 696 | ); 697 | runOnlyForDeploymentPostprocessing = 0; 698 | }; 699 | E30DDF5B1C90EAA400FBC536 /* Resources */ = { 700 | isa = PBXResourcesBuildPhase; 701 | buildActionMask = 2147483647; 702 | files = ( 703 | ); 704 | runOnlyForDeploymentPostprocessing = 0; 705 | }; 706 | E30DDF6E1C90EC5E00FBC536 /* Resources */ = { 707 | isa = PBXResourcesBuildPhase; 708 | buildActionMask = 2147483647; 709 | files = ( 710 | ); 711 | runOnlyForDeploymentPostprocessing = 0; 712 | }; 713 | E30DDF7B1C90EC6F00FBC536 /* Resources */ = { 714 | isa = PBXResourcesBuildPhase; 715 | buildActionMask = 2147483647; 716 | files = ( 717 | ); 718 | runOnlyForDeploymentPostprocessing = 0; 719 | }; 720 | E30DDF881C90EC7D00FBC536 /* Resources */ = { 721 | isa = PBXResourcesBuildPhase; 722 | buildActionMask = 2147483647; 723 | files = ( 724 | ); 725 | runOnlyForDeploymentPostprocessing = 0; 726 | }; 727 | E34D11D91B1D032B000816A9 /* Resources */ = { 728 | isa = PBXResourcesBuildPhase; 729 | buildActionMask = 2147483647; 730 | files = ( 731 | ); 732 | runOnlyForDeploymentPostprocessing = 0; 733 | }; 734 | E34D11E41B1D032B000816A9 /* Resources */ = { 735 | isa = PBXResourcesBuildPhase; 736 | buildActionMask = 2147483647; 737 | files = ( 738 | ); 739 | runOnlyForDeploymentPostprocessing = 0; 740 | }; 741 | /* End PBXResourcesBuildPhase section */ 742 | 743 | /* Begin PBXSourcesBuildPhase section */ 744 | E30DDF491C90E9C800FBC536 /* Sources */ = { 745 | isa = PBXSourcesBuildPhase; 746 | buildActionMask = 2147483647; 747 | files = ( 748 | E3D96D641CECF72F00D58C9E /* NSAttributedString+Extensions.swift in Sources */, 749 | E3C7CBB41F633AD300719D0E /* URL+Extensions.swift in Sources */, 750 | E3D96D5E1CECF6EC00D58C9E /* NSLayoutConstraint+Extensions.swift in Sources */, 751 | E3D96D581CECF6B800D58C9E /* NSObject+Extensions.swift in Sources */, 752 | E3D96D5B1CECF6D100D58C9E /* NSThread+Extensions.swift in Sources */, 753 | E3D96D671CECF74200D58C9E /* NSNotificationCenter+Extensions.swift in Sources */, 754 | E3D96D6A1CECF77300D58C9E /* Dispatch+Extensions.swift in Sources */, 755 | ); 756 | runOnlyForDeploymentPostprocessing = 0; 757 | }; 758 | E30DDF581C90EAA400FBC536 /* Sources */ = { 759 | isa = PBXSourcesBuildPhase; 760 | buildActionMask = 2147483647; 761 | files = ( 762 | E3D96D7C1CECF93E00D58C9E /* StringLiteralConvertible+Extensions.swift in Sources */, 763 | E3D96D881CECF9F600D58C9E /* BinaryInteger+Extensions.swift in Sources */, 764 | E3D96D851CECF9D100D58C9E /* Optional+Extensions.swift in Sources */, 765 | E3D96D731CECF8E200D58C9E /* RangeReplaceableCollectionType+Extensions.swift in Sources */, 766 | E3D96D761CECF8F700D58C9E /* CollectionType+Extensions.swift in Sources */, 767 | E3D96D8B1CECFA5900D58C9E /* Swift+Extensions.swift in Sources */, 768 | E3D96D701CECF8B200D58C9E /* SortOrder.swift in Sources */, 769 | E3D96D6D1CECF85300D58C9E /* SequenceType+Extensions.swift in Sources */, 770 | E3D96D791CECF91300D58C9E /* Dictionary+Extensions.swift in Sources */, 771 | E3D96D821CECF9AA00D58C9E /* OptionalConvertible.swift in Sources */, 772 | E3C7CBB11F63331000719D0E /* UnsignedInteger+Extensions.swift in Sources */, 773 | E3C7CBAA1F63205300719D0E /* FloatingPoint+Extensions.swift in Sources */, 774 | E3D96D7F1CECF97200D58C9E /* Comparable+Extensions.swift in Sources */, 775 | E3C7CBAE1F632D9000719D0E /* SignedNumeric+Extensions.swift in Sources */, 776 | ); 777 | runOnlyForDeploymentPostprocessing = 0; 778 | }; 779 | E30DDF6B1C90EC5E00FBC536 /* Sources */ = { 780 | isa = PBXSourcesBuildPhase; 781 | buildActionMask = 2147483647; 782 | files = ( 783 | E3D96D491CECF51400D58C9E /* UIEdgeInsets+Extensions.swift in Sources */, 784 | E3D96D4C1CECF57C00D58C9E /* CGRect+Extensions.swift in Sources */, 785 | E3D96D551CECF66700D58C9E /* CGGeometry+CGFloatTuple.swift in Sources */, 786 | E3D96D461CECF4DA00D58C9E /* CGPoint+Extensions.swift in Sources */, 787 | E3D96D4F1CECF5AF00D58C9E /* CGFloatTuple.swift in Sources */, 788 | ); 789 | runOnlyForDeploymentPostprocessing = 0; 790 | }; 791 | E30DDF781C90EC6F00FBC536 /* Sources */ = { 792 | isa = PBXSourcesBuildPhase; 793 | buildActionMask = 2147483647; 794 | files = ( 795 | E3D96D3D1CECF19500D58C9E /* UIImageView+Extensions.swift in Sources */, 796 | E3D96D3F1CECF19500D58C9E /* UITableView+Extensions.swift in Sources */, 797 | E3D96D331CECF19500D58C9E /* UICollectionView+Extensions.swift in Sources */, 798 | E3D96D371CECF19500D58C9E /* UIFont+Extensions.swift in Sources */, 799 | E3D96D431CECF19500D58C9E /* UIViewController+Extensions.swift in Sources */, 800 | E3D96D3B1CECF19500D58C9E /* UIImage+Extensions.swift in Sources */, 801 | E3D96D351CECF19500D58C9E /* UIColor+Extensions.swift in Sources */, 802 | E3D96D411CECF19500D58C9E /* UIView+Extensions.swift in Sources */, 803 | E3D96D391CECF19500D58C9E /* UIGestureRecognizer+Extensions.swift in Sources */, 804 | ); 805 | runOnlyForDeploymentPostprocessing = 0; 806 | }; 807 | E30DDF851C90EC7D00FBC536 /* Sources */ = { 808 | isa = PBXSourcesBuildPhase; 809 | buildActionMask = 2147483647; 810 | files = ( 811 | E3D96D8E1CECFA7800D58C9E /* MultiRange.swift in Sources */, 812 | ); 813 | runOnlyForDeploymentPostprocessing = 0; 814 | }; 815 | E34D11D61B1D032B000816A9 /* Sources */ = { 816 | isa = PBXSourcesBuildPhase; 817 | buildActionMask = 2147483647; 818 | files = ( 819 | E3D96D871CECF9F600D58C9E /* BinaryInteger+Extensions.swift in Sources */, 820 | E3D96D3C1CECF19500D58C9E /* UIImageView+Extensions.swift in Sources */, 821 | E3D96D781CECF91300D58C9E /* Dictionary+Extensions.swift in Sources */, 822 | E3D96D8D1CECFA7800D58C9E /* MultiRange.swift in Sources */, 823 | E3D96D421CECF19500D58C9E /* UIViewController+Extensions.swift in Sources */, 824 | E3D96D721CECF8E200D58C9E /* RangeReplaceableCollectionType+Extensions.swift in Sources */, 825 | E3D96D8A1CECFA5900D58C9E /* Swift+Extensions.swift in Sources */, 826 | E3D96D341CECF19500D58C9E /* UIColor+Extensions.swift in Sources */, 827 | E3D96D751CECF8F700D58C9E /* CollectionType+Extensions.swift in Sources */, 828 | E3D96D4E1CECF5AF00D58C9E /* CGFloatTuple.swift in Sources */, 829 | E3D96D5A1CECF6D100D58C9E /* NSThread+Extensions.swift in Sources */, 830 | E3D96D691CECF77300D58C9E /* Dispatch+Extensions.swift in Sources */, 831 | E3D96D4B1CECF57C00D58C9E /* CGRect+Extensions.swift in Sources */, 832 | E3C7CBB31F633AD300719D0E /* URL+Extensions.swift in Sources */, 833 | E3C7CBAD1F632D9000719D0E /* SignedNumeric+Extensions.swift in Sources */, 834 | E3C7CBAB1F632D3100719D0E /* FloatingPoint+Extensions.swift in Sources */, 835 | E3D96D6F1CECF8B200D58C9E /* SortOrder.swift in Sources */, 836 | E3D96D321CECF19500D58C9E /* UICollectionView+Extensions.swift in Sources */, 837 | E3D96D401CECF19500D58C9E /* UIView+Extensions.swift in Sources */, 838 | E3D96D7B1CECF93E00D58C9E /* StringLiteralConvertible+Extensions.swift in Sources */, 839 | E3D96D571CECF6B800D58C9E /* NSObject+Extensions.swift in Sources */, 840 | E3D96D6C1CECF85300D58C9E /* SequenceType+Extensions.swift in Sources */, 841 | E3D96D661CECF74200D58C9E /* NSNotificationCenter+Extensions.swift in Sources */, 842 | E3D96D631CECF72F00D58C9E /* NSAttributedString+Extensions.swift in Sources */, 843 | E3D96D841CECF9D100D58C9E /* Optional+Extensions.swift in Sources */, 844 | E3D96D481CECF51400D58C9E /* UIEdgeInsets+Extensions.swift in Sources */, 845 | E3D96D5D1CECF6EC00D58C9E /* NSLayoutConstraint+Extensions.swift in Sources */, 846 | E3D96D451CECF4DA00D58C9E /* CGPoint+Extensions.swift in Sources */, 847 | E3D96D3E1CECF19500D58C9E /* UITableView+Extensions.swift in Sources */, 848 | E3D96D811CECF9AA00D58C9E /* OptionalConvertible.swift in Sources */, 849 | E3D96D7E1CECF97200D58C9E /* Comparable+Extensions.swift in Sources */, 850 | E3D96D3A1CECF19500D58C9E /* UIImage+Extensions.swift in Sources */, 851 | E3C7CBB01F63331000719D0E /* UnsignedInteger+Extensions.swift in Sources */, 852 | E3D96D361CECF19500D58C9E /* UIFont+Extensions.swift in Sources */, 853 | E3D96D541CECF66700D58C9E /* CGGeometry+CGFloatTuple.swift in Sources */, 854 | E3D96D381CECF19500D58C9E /* UIGestureRecognizer+Extensions.swift in Sources */, 855 | ); 856 | runOnlyForDeploymentPostprocessing = 0; 857 | }; 858 | E34D11E21B1D032B000816A9 /* Sources */ = { 859 | isa = PBXSourcesBuildPhase; 860 | buildActionMask = 2147483647; 861 | files = ( 862 | E34D11EE1B1D032B000816A9 /* SwiftySwiftTests.swift in Sources */, 863 | ); 864 | runOnlyForDeploymentPostprocessing = 0; 865 | }; 866 | /* End PBXSourcesBuildPhase section */ 867 | 868 | /* Begin PBXTargetDependency section */ 869 | E30DDF9B1C90EF3A00FBC536 /* PBXTargetDependency */ = { 870 | isa = PBXTargetDependency; 871 | target = E30DDF5C1C90EAA400FBC536 /* SwiftyCore */; 872 | targetProxy = E30DDF9A1C90EF3A00FBC536 /* PBXContainerItemProxy */; 873 | }; 874 | E30DDF9D1C90EF4000FBC536 /* PBXTargetDependency */ = { 875 | isa = PBXTargetDependency; 876 | target = E30DDF5C1C90EAA400FBC536 /* SwiftyCore */; 877 | targetProxy = E30DDF9C1C90EF4000FBC536 /* PBXContainerItemProxy */; 878 | }; 879 | E30DDF9F1C90EF4500FBC536 /* PBXTargetDependency */ = { 880 | isa = PBXTargetDependency; 881 | target = E30DDF5C1C90EAA400FBC536 /* SwiftyCore */; 882 | targetProxy = E30DDF9E1C90EF4500FBC536 /* PBXContainerItemProxy */; 883 | }; 884 | E30DDFA11C90EF4900FBC536 /* PBXTargetDependency */ = { 885 | isa = PBXTargetDependency; 886 | target = E30DDF4D1C90E9C800FBC536 /* SwiftyCocoa */; 887 | targetProxy = E30DDFA01C90EF4900FBC536 /* PBXContainerItemProxy */; 888 | }; 889 | E30DDFA31C90EF5300FBC536 /* PBXTargetDependency */ = { 890 | isa = PBXTargetDependency; 891 | target = E30DDF4D1C90E9C800FBC536 /* SwiftyCocoa */; 892 | targetProxy = E30DDFA21C90EF5300FBC536 /* PBXContainerItemProxy */; 893 | }; 894 | E30DDFA51C90EF5600FBC536 /* PBXTargetDependency */ = { 895 | isa = PBXTargetDependency; 896 | target = E30DDF5C1C90EAA400FBC536 /* SwiftyCore */; 897 | targetProxy = E30DDFA41C90EF5600FBC536 /* PBXContainerItemProxy */; 898 | }; 899 | E30DDFA71C90EF5A00FBC536 /* PBXTargetDependency */ = { 900 | isa = PBXTargetDependency; 901 | target = E30DDF6F1C90EC5E00FBC536 /* SwiftyGeometry */; 902 | targetProxy = E30DDFA61C90EF5A00FBC536 /* PBXContainerItemProxy */; 903 | }; 904 | E30DDFA91C90EF5C00FBC536 /* PBXTargetDependency */ = { 905 | isa = PBXTargetDependency; 906 | target = E30DDF7C1C90EC6F00FBC536 /* SwiftyUIKit */; 907 | targetProxy = E30DDFA81C90EF5C00FBC536 /* PBXContainerItemProxy */; 908 | }; 909 | E30DDFAB1C90EF5F00FBC536 /* PBXTargetDependency */ = { 910 | isa = PBXTargetDependency; 911 | target = E30DDF891C90EC7D00FBC536 /* MultiRange */; 912 | targetProxy = E30DDFAA1C90EF5F00FBC536 /* PBXContainerItemProxy */; 913 | }; 914 | E34D11E91B1D032B000816A9 /* PBXTargetDependency */ = { 915 | isa = PBXTargetDependency; 916 | target = E34D11DA1B1D032B000816A9 /* SwiftySwift */; 917 | targetProxy = E34D11E81B1D032B000816A9 /* PBXContainerItemProxy */; 918 | }; 919 | /* End PBXTargetDependency section */ 920 | 921 | /* Begin XCBuildConfiguration section */ 922 | E30DDF531C90E9C800FBC536 /* Debug */ = { 923 | isa = XCBuildConfiguration; 924 | buildSettings = { 925 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 926 | DEBUG_INFORMATION_FORMAT = dwarf; 927 | DEFINES_MODULE = YES; 928 | DYLIB_COMPATIBILITY_VERSION = 1; 929 | DYLIB_CURRENT_VERSION = 1; 930 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 931 | INFOPLIST_FILE = SwiftyCocoa/Info.plist; 932 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 933 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 934 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 935 | PRODUCT_BUNDLE_IDENTIFIER = com.adc.SwiftyCocoa; 936 | PRODUCT_NAME = "$(TARGET_NAME)"; 937 | SKIP_INSTALL = YES; 938 | SWIFT_SWIFT3_OBJC_INFERENCE = Off; 939 | SWIFT_VERSION = 4.0; 940 | }; 941 | name = Debug; 942 | }; 943 | E30DDF541C90E9C800FBC536 /* Release */ = { 944 | isa = XCBuildConfiguration; 945 | buildSettings = { 946 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 947 | DEFINES_MODULE = YES; 948 | DYLIB_COMPATIBILITY_VERSION = 1; 949 | DYLIB_CURRENT_VERSION = 1; 950 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 951 | INFOPLIST_FILE = SwiftyCocoa/Info.plist; 952 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 953 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 954 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 955 | PRODUCT_BUNDLE_IDENTIFIER = com.adc.SwiftyCocoa; 956 | PRODUCT_NAME = "$(TARGET_NAME)"; 957 | SKIP_INSTALL = YES; 958 | SWIFT_SWIFT3_OBJC_INFERENCE = Off; 959 | SWIFT_VERSION = 4.0; 960 | }; 961 | name = Release; 962 | }; 963 | E30DDF631C90EAA400FBC536 /* Debug */ = { 964 | isa = XCBuildConfiguration; 965 | buildSettings = { 966 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 967 | DEBUG_INFORMATION_FORMAT = dwarf; 968 | DEFINES_MODULE = YES; 969 | DYLIB_COMPATIBILITY_VERSION = 1; 970 | DYLIB_CURRENT_VERSION = 1; 971 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 972 | INFOPLIST_FILE = SwiftyCore/Info.plist; 973 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 974 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 975 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 976 | PRODUCT_BUNDLE_IDENTIFIER = com.adc.SwiftyCore; 977 | PRODUCT_NAME = "$(TARGET_NAME)"; 978 | SKIP_INSTALL = YES; 979 | SWIFT_SWIFT3_OBJC_INFERENCE = Off; 980 | SWIFT_VERSION = 4.0; 981 | }; 982 | name = Debug; 983 | }; 984 | E30DDF641C90EAA400FBC536 /* Release */ = { 985 | isa = XCBuildConfiguration; 986 | buildSettings = { 987 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 988 | DEFINES_MODULE = YES; 989 | DYLIB_COMPATIBILITY_VERSION = 1; 990 | DYLIB_CURRENT_VERSION = 1; 991 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 992 | INFOPLIST_FILE = SwiftyCore/Info.plist; 993 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 994 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 995 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 996 | PRODUCT_BUNDLE_IDENTIFIER = com.adc.SwiftyCore; 997 | PRODUCT_NAME = "$(TARGET_NAME)"; 998 | SKIP_INSTALL = YES; 999 | SWIFT_SWIFT3_OBJC_INFERENCE = Off; 1000 | SWIFT_VERSION = 4.0; 1001 | }; 1002 | name = Release; 1003 | }; 1004 | E30DDF761C90EC5E00FBC536 /* Debug */ = { 1005 | isa = XCBuildConfiguration; 1006 | buildSettings = { 1007 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1008 | DEBUG_INFORMATION_FORMAT = dwarf; 1009 | DEFINES_MODULE = YES; 1010 | DYLIB_COMPATIBILITY_VERSION = 1; 1011 | DYLIB_CURRENT_VERSION = 1; 1012 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1013 | INFOPLIST_FILE = SwiftyGeometry/Info.plist; 1014 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1015 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1016 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1017 | PRODUCT_BUNDLE_IDENTIFIER = com.adc.SwiftyGeometry; 1018 | PRODUCT_NAME = "$(TARGET_NAME)"; 1019 | SKIP_INSTALL = YES; 1020 | SWIFT_SWIFT3_OBJC_INFERENCE = Off; 1021 | SWIFT_VERSION = 4.0; 1022 | }; 1023 | name = Debug; 1024 | }; 1025 | E30DDF771C90EC5E00FBC536 /* Release */ = { 1026 | isa = XCBuildConfiguration; 1027 | buildSettings = { 1028 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1029 | DEFINES_MODULE = YES; 1030 | DYLIB_COMPATIBILITY_VERSION = 1; 1031 | DYLIB_CURRENT_VERSION = 1; 1032 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1033 | INFOPLIST_FILE = SwiftyGeometry/Info.plist; 1034 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1035 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1036 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1037 | PRODUCT_BUNDLE_IDENTIFIER = com.adc.SwiftyGeometry; 1038 | PRODUCT_NAME = "$(TARGET_NAME)"; 1039 | SKIP_INSTALL = YES; 1040 | SWIFT_SWIFT3_OBJC_INFERENCE = Off; 1041 | SWIFT_VERSION = 4.0; 1042 | }; 1043 | name = Release; 1044 | }; 1045 | E30DDF831C90EC6F00FBC536 /* Debug */ = { 1046 | isa = XCBuildConfiguration; 1047 | buildSettings = { 1048 | CLANG_ENABLE_MODULES = YES; 1049 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1050 | DEBUG_INFORMATION_FORMAT = dwarf; 1051 | DEFINES_MODULE = YES; 1052 | DYLIB_COMPATIBILITY_VERSION = 1; 1053 | DYLIB_CURRENT_VERSION = 1; 1054 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1055 | INFOPLIST_FILE = SwiftyUIKit/Info.plist; 1056 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1057 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1058 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1059 | PRODUCT_BUNDLE_IDENTIFIER = com.adc.SwiftyUIKit; 1060 | PRODUCT_NAME = "$(TARGET_NAME)"; 1061 | SKIP_INSTALL = YES; 1062 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 1063 | SWIFT_SWIFT3_OBJC_INFERENCE = Off; 1064 | SWIFT_VERSION = 4.0; 1065 | }; 1066 | name = Debug; 1067 | }; 1068 | E30DDF841C90EC6F00FBC536 /* Release */ = { 1069 | isa = XCBuildConfiguration; 1070 | buildSettings = { 1071 | CLANG_ENABLE_MODULES = YES; 1072 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1073 | DEFINES_MODULE = YES; 1074 | DYLIB_COMPATIBILITY_VERSION = 1; 1075 | DYLIB_CURRENT_VERSION = 1; 1076 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1077 | INFOPLIST_FILE = SwiftyUIKit/Info.plist; 1078 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1079 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1080 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1081 | PRODUCT_BUNDLE_IDENTIFIER = com.adc.SwiftyUIKit; 1082 | PRODUCT_NAME = "$(TARGET_NAME)"; 1083 | SKIP_INSTALL = YES; 1084 | SWIFT_SWIFT3_OBJC_INFERENCE = Off; 1085 | SWIFT_VERSION = 4.0; 1086 | }; 1087 | name = Release; 1088 | }; 1089 | E30DDF901C90EC7D00FBC536 /* Debug */ = { 1090 | isa = XCBuildConfiguration; 1091 | buildSettings = { 1092 | CLANG_ENABLE_MODULES = YES; 1093 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1094 | DEBUG_INFORMATION_FORMAT = dwarf; 1095 | DEFINES_MODULE = YES; 1096 | DYLIB_COMPATIBILITY_VERSION = 1; 1097 | DYLIB_CURRENT_VERSION = 1; 1098 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1099 | INFOPLIST_FILE = MultiRange/Info.plist; 1100 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1101 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1102 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1103 | PRODUCT_BUNDLE_IDENTIFIER = com.adc.MultiRange; 1104 | PRODUCT_NAME = "$(TARGET_NAME)"; 1105 | PROVISIONING_PROFILE_SPECIFIER = ""; 1106 | SKIP_INSTALL = YES; 1107 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 1108 | SWIFT_SWIFT3_OBJC_INFERENCE = Off; 1109 | SWIFT_VERSION = 4.0; 1110 | }; 1111 | name = Debug; 1112 | }; 1113 | E30DDF911C90EC7D00FBC536 /* Release */ = { 1114 | isa = XCBuildConfiguration; 1115 | buildSettings = { 1116 | CLANG_ENABLE_MODULES = YES; 1117 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1118 | DEFINES_MODULE = YES; 1119 | DYLIB_COMPATIBILITY_VERSION = 1; 1120 | DYLIB_CURRENT_VERSION = 1; 1121 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1122 | INFOPLIST_FILE = MultiRange/Info.plist; 1123 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1124 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1125 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1126 | PRODUCT_BUNDLE_IDENTIFIER = com.adc.MultiRange; 1127 | PRODUCT_NAME = "$(TARGET_NAME)"; 1128 | PROVISIONING_PROFILE_SPECIFIER = ""; 1129 | SKIP_INSTALL = YES; 1130 | SWIFT_SWIFT3_OBJC_INFERENCE = Off; 1131 | SWIFT_VERSION = 4.0; 1132 | }; 1133 | name = Release; 1134 | }; 1135 | E34D11EF1B1D032B000816A9 /* Debug */ = { 1136 | isa = XCBuildConfiguration; 1137 | buildSettings = { 1138 | ALWAYS_SEARCH_USER_PATHS = NO; 1139 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 1140 | CLANG_CXX_LIBRARY = "libc++"; 1141 | CLANG_ENABLE_MODULES = YES; 1142 | CLANG_ENABLE_OBJC_ARC = YES; 1143 | CLANG_WARN_BOOL_CONVERSION = YES; 1144 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1145 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1146 | CLANG_WARN_EMPTY_BODY = YES; 1147 | CLANG_WARN_ENUM_CONVERSION = YES; 1148 | CLANG_WARN_INT_CONVERSION = YES; 1149 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1150 | CLANG_WARN_UNREACHABLE_CODE = YES; 1151 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1152 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1153 | COPY_PHASE_STRIP = NO; 1154 | CURRENT_PROJECT_VERSION = 1; 1155 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 1156 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1157 | ENABLE_TESTABILITY = YES; 1158 | GCC_C_LANGUAGE_STANDARD = gnu99; 1159 | GCC_DYNAMIC_NO_PIC = NO; 1160 | GCC_NO_COMMON_BLOCKS = YES; 1161 | GCC_OPTIMIZATION_LEVEL = 0; 1162 | GCC_PREPROCESSOR_DEFINITIONS = ( 1163 | "DEBUG=1", 1164 | "$(inherited)", 1165 | ); 1166 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 1167 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1168 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1169 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1170 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1171 | GCC_WARN_UNUSED_FUNCTION = YES; 1172 | GCC_WARN_UNUSED_VARIABLE = YES; 1173 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1174 | MTL_ENABLE_DEBUG_INFO = YES; 1175 | ONLY_ACTIVE_ARCH = YES; 1176 | SDKROOT = iphoneos; 1177 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 1178 | TARGETED_DEVICE_FAMILY = "1,2"; 1179 | VERSIONING_SYSTEM = "apple-generic"; 1180 | VERSION_INFO_PREFIX = ""; 1181 | }; 1182 | name = Debug; 1183 | }; 1184 | E34D11F01B1D032B000816A9 /* Release */ = { 1185 | isa = XCBuildConfiguration; 1186 | buildSettings = { 1187 | ALWAYS_SEARCH_USER_PATHS = NO; 1188 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 1189 | CLANG_CXX_LIBRARY = "libc++"; 1190 | CLANG_ENABLE_MODULES = YES; 1191 | CLANG_ENABLE_OBJC_ARC = YES; 1192 | CLANG_WARN_BOOL_CONVERSION = YES; 1193 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1194 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1195 | CLANG_WARN_EMPTY_BODY = YES; 1196 | CLANG_WARN_ENUM_CONVERSION = YES; 1197 | CLANG_WARN_INT_CONVERSION = YES; 1198 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1199 | CLANG_WARN_UNREACHABLE_CODE = YES; 1200 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1201 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1202 | COPY_PHASE_STRIP = NO; 1203 | CURRENT_PROJECT_VERSION = 1; 1204 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 1205 | ENABLE_NS_ASSERTIONS = NO; 1206 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1207 | GCC_C_LANGUAGE_STANDARD = gnu99; 1208 | GCC_NO_COMMON_BLOCKS = YES; 1209 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1210 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1211 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1212 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1213 | GCC_WARN_UNUSED_FUNCTION = YES; 1214 | GCC_WARN_UNUSED_VARIABLE = YES; 1215 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1216 | MTL_ENABLE_DEBUG_INFO = NO; 1217 | SDKROOT = iphoneos; 1218 | TARGETED_DEVICE_FAMILY = "1,2"; 1219 | VALIDATE_PRODUCT = YES; 1220 | VERSIONING_SYSTEM = "apple-generic"; 1221 | VERSION_INFO_PREFIX = ""; 1222 | }; 1223 | name = Release; 1224 | }; 1225 | E34D11F21B1D032B000816A9 /* Debug */ = { 1226 | isa = XCBuildConfiguration; 1227 | buildSettings = { 1228 | CLANG_ENABLE_MODULES = YES; 1229 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1230 | DEFINES_MODULE = YES; 1231 | DYLIB_COMPATIBILITY_VERSION = 1; 1232 | DYLIB_CURRENT_VERSION = 1; 1233 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1234 | INFOPLIST_FILE = SwiftySwift/Info.plist; 1235 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1236 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1237 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1238 | PRODUCT_BUNDLE_IDENTIFIER = "com.adc.$(PRODUCT_NAME:rfc1034identifier)"; 1239 | PRODUCT_NAME = "$(TARGET_NAME)"; 1240 | SKIP_INSTALL = YES; 1241 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 1242 | SWIFT_SWIFT3_OBJC_INFERENCE = Off; 1243 | SWIFT_VERSION = 4.0; 1244 | }; 1245 | name = Debug; 1246 | }; 1247 | E34D11F31B1D032B000816A9 /* Release */ = { 1248 | isa = XCBuildConfiguration; 1249 | buildSettings = { 1250 | CLANG_ENABLE_MODULES = YES; 1251 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1252 | DEFINES_MODULE = YES; 1253 | DYLIB_COMPATIBILITY_VERSION = 1; 1254 | DYLIB_CURRENT_VERSION = 1; 1255 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1256 | INFOPLIST_FILE = SwiftySwift/Info.plist; 1257 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1258 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1259 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1260 | PRODUCT_BUNDLE_IDENTIFIER = "com.adc.$(PRODUCT_NAME:rfc1034identifier)"; 1261 | PRODUCT_NAME = "$(TARGET_NAME)"; 1262 | SKIP_INSTALL = YES; 1263 | SWIFT_SWIFT3_OBJC_INFERENCE = Off; 1264 | SWIFT_VERSION = 4.0; 1265 | }; 1266 | name = Release; 1267 | }; 1268 | E34D11F51B1D032B000816A9 /* Debug */ = { 1269 | isa = XCBuildConfiguration; 1270 | buildSettings = { 1271 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1272 | GCC_PREPROCESSOR_DEFINITIONS = ( 1273 | "DEBUG=1", 1274 | "$(inherited)", 1275 | ); 1276 | INFOPLIST_FILE = SwiftySwiftTests/Info.plist; 1277 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1278 | PRODUCT_BUNDLE_IDENTIFIER = "com.adc.$(PRODUCT_NAME:rfc1034identifier)"; 1279 | PRODUCT_NAME = "$(TARGET_NAME)"; 1280 | SWIFT_SWIFT3_OBJC_INFERENCE = Off; 1281 | SWIFT_VERSION = 4.0; 1282 | }; 1283 | name = Debug; 1284 | }; 1285 | E34D11F61B1D032B000816A9 /* Release */ = { 1286 | isa = XCBuildConfiguration; 1287 | buildSettings = { 1288 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1289 | INFOPLIST_FILE = SwiftySwiftTests/Info.plist; 1290 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1291 | PRODUCT_BUNDLE_IDENTIFIER = "com.adc.$(PRODUCT_NAME:rfc1034identifier)"; 1292 | PRODUCT_NAME = "$(TARGET_NAME)"; 1293 | SWIFT_SWIFT3_OBJC_INFERENCE = Off; 1294 | SWIFT_VERSION = 4.0; 1295 | }; 1296 | name = Release; 1297 | }; 1298 | /* End XCBuildConfiguration section */ 1299 | 1300 | /* Begin XCConfigurationList section */ 1301 | E30DDF551C90E9C800FBC536 /* Build configuration list for PBXNativeTarget "SwiftyCocoa" */ = { 1302 | isa = XCConfigurationList; 1303 | buildConfigurations = ( 1304 | E30DDF531C90E9C800FBC536 /* Debug */, 1305 | E30DDF541C90E9C800FBC536 /* Release */, 1306 | ); 1307 | defaultConfigurationIsVisible = 0; 1308 | defaultConfigurationName = Release; 1309 | }; 1310 | E30DDF621C90EAA400FBC536 /* Build configuration list for PBXNativeTarget "SwiftyCore" */ = { 1311 | isa = XCConfigurationList; 1312 | buildConfigurations = ( 1313 | E30DDF631C90EAA400FBC536 /* Debug */, 1314 | E30DDF641C90EAA400FBC536 /* Release */, 1315 | ); 1316 | defaultConfigurationIsVisible = 0; 1317 | defaultConfigurationName = Release; 1318 | }; 1319 | E30DDF751C90EC5E00FBC536 /* Build configuration list for PBXNativeTarget "SwiftyGeometry" */ = { 1320 | isa = XCConfigurationList; 1321 | buildConfigurations = ( 1322 | E30DDF761C90EC5E00FBC536 /* Debug */, 1323 | E30DDF771C90EC5E00FBC536 /* Release */, 1324 | ); 1325 | defaultConfigurationIsVisible = 0; 1326 | defaultConfigurationName = Release; 1327 | }; 1328 | E30DDF821C90EC6F00FBC536 /* Build configuration list for PBXNativeTarget "SwiftyUIKit" */ = { 1329 | isa = XCConfigurationList; 1330 | buildConfigurations = ( 1331 | E30DDF831C90EC6F00FBC536 /* Debug */, 1332 | E30DDF841C90EC6F00FBC536 /* Release */, 1333 | ); 1334 | defaultConfigurationIsVisible = 0; 1335 | defaultConfigurationName = Release; 1336 | }; 1337 | E30DDF8F1C90EC7D00FBC536 /* Build configuration list for PBXNativeTarget "MultiRange" */ = { 1338 | isa = XCConfigurationList; 1339 | buildConfigurations = ( 1340 | E30DDF901C90EC7D00FBC536 /* Debug */, 1341 | E30DDF911C90EC7D00FBC536 /* Release */, 1342 | ); 1343 | defaultConfigurationIsVisible = 0; 1344 | defaultConfigurationName = Release; 1345 | }; 1346 | E34D11D51B1D032B000816A9 /* Build configuration list for PBXProject "SwiftySwift" */ = { 1347 | isa = XCConfigurationList; 1348 | buildConfigurations = ( 1349 | E34D11EF1B1D032B000816A9 /* Debug */, 1350 | E34D11F01B1D032B000816A9 /* Release */, 1351 | ); 1352 | defaultConfigurationIsVisible = 0; 1353 | defaultConfigurationName = Release; 1354 | }; 1355 | E34D11F11B1D032B000816A9 /* Build configuration list for PBXNativeTarget "SwiftySwift" */ = { 1356 | isa = XCConfigurationList; 1357 | buildConfigurations = ( 1358 | E34D11F21B1D032B000816A9 /* Debug */, 1359 | E34D11F31B1D032B000816A9 /* Release */, 1360 | ); 1361 | defaultConfigurationIsVisible = 0; 1362 | defaultConfigurationName = Release; 1363 | }; 1364 | E34D11F41B1D032B000816A9 /* Build configuration list for PBXNativeTarget "SwiftySwiftTests" */ = { 1365 | isa = XCConfigurationList; 1366 | buildConfigurations = ( 1367 | E34D11F51B1D032B000816A9 /* Debug */, 1368 | E34D11F61B1D032B000816A9 /* Release */, 1369 | ); 1370 | defaultConfigurationIsVisible = 0; 1371 | defaultConfigurationName = Release; 1372 | }; 1373 | /* End XCConfigurationList section */ 1374 | }; 1375 | rootObject = E34D11D21B1D032B000816A9 /* Project object */; 1376 | } 1377 | -------------------------------------------------------------------------------- /SwiftySwift.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /SwiftySwift.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /SwiftySwift.xcodeproj/xcshareddata/IDETemplateMacros.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | FILEHEADER 6 | 7 | // ___FILENAME___ 8 | // ___PACKAGENAME___ 9 | // 10 | // ___COPYRIGHT___ 11 | // 12 | 13 | 14 | -------------------------------------------------------------------------------- /SwiftySwift.xcodeproj/xcshareddata/xcschemes/MultiRange.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /SwiftySwift.xcodeproj/xcshareddata/xcschemes/SwiftyCocoa.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /SwiftySwift.xcodeproj/xcshareddata/xcschemes/SwiftyCore.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /SwiftySwift.xcodeproj/xcshareddata/xcschemes/SwiftyGeometry.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /SwiftySwift.xcodeproj/xcshareddata/xcschemes/SwiftySwift.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 67 | 68 | 78 | 79 | 85 | 86 | 87 | 88 | 89 | 90 | 96 | 97 | 103 | 104 | 105 | 106 | 108 | 109 | 112 | 113 | 114 | -------------------------------------------------------------------------------- /SwiftySwift.xcodeproj/xcshareddata/xcschemes/SwiftyUIKit.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /SwiftySwift/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /SwiftySwift/SwiftySwift.h: -------------------------------------------------------------------------------- 1 | // 2 | // SwiftySwift.h 3 | // SwiftySwift 4 | // 5 | // Created by Agustín de Cabrera on 6/1/15. 6 | // Copyright (c) 2015 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | 11 | //! Project version number for SwiftySwift. 12 | FOUNDATION_EXPORT double SwiftySwiftVersionNumber; 13 | 14 | //! Project version string for SwiftySwift. 15 | FOUNDATION_EXPORT const unsigned char SwiftySwiftVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /SwiftySwiftTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /SwiftySwiftTests/SwiftySwiftTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SwiftySwiftTests.swift 3 | // SwiftySwiftTests 4 | // 5 | // Created by Agustín de Cabrera on 6/1/15. 6 | // Copyright (c) 2015 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import XCTest 11 | import SwiftySwift 12 | 13 | class SwiftySwiftTests: XCTestCase { 14 | override func setUp() { 15 | super.setUp() 16 | } 17 | 18 | override func tearDown() { 19 | super.tearDown() 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /SwiftyUIKit/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /SwiftyUIKit/SwiftyUIKit.h: -------------------------------------------------------------------------------- 1 | // 2 | // SwiftyUIKit.h 3 | // SwiftyUIKit 4 | // 5 | // Created by Agustín de Cabrera on 3/9/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | @import SwiftyCore; 11 | @import SwiftyCocoa; 12 | 13 | //! Project version number for SwiftyUIKit. 14 | FOUNDATION_EXPORT double SwiftyUIKitVersionNumber; 15 | 16 | //! Project version string for SwiftyUIKit. 17 | FOUNDATION_EXPORT const unsigned char SwiftyUIKitVersionString[]; 18 | 19 | // In this header, you should import all the public headers of your framework using statements like #import 20 | 21 | 22 | -------------------------------------------------------------------------------- /SwiftyUIKit/UICollectionView+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UICollectionView+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK: - UICollectionView 12 | 13 | extension UICollectionView { 14 | public var collectionViewFlowLayout: UICollectionViewFlowLayout { 15 | get { return collectionViewLayout as! UICollectionViewFlowLayout } 16 | set { collectionViewLayout = newValue } 17 | } 18 | 19 | public var numberOfItems: Int { 20 | return (0..(forIndexPath indexPath: IndexPath) -> T { 26 | return dequeueReusableCell(withReuseIdentifier: T.cellIdentifier, for: indexPath) as! T 27 | } 28 | 29 | public func dequeueReusableSupplementaryView(ofKind elementKind: String, forIndexPath indexPath: IndexPath) -> T { 30 | return dequeueReusableSupplementaryView(ofKind: elementKind, withReuseIdentifier: T.className, for: indexPath) as! T 31 | } 32 | } 33 | 34 | // MARK: - UICollectionViewCell 35 | 36 | extension UICollectionViewCell { 37 | public static var cellIdentifier: String { 38 | return className 39 | } 40 | 41 | public class func dequeueReusableCell(fromCollectionView collectionView: UICollectionView, indexPath: IndexPath) -> Self { 42 | return collectionView.dequeueReusableCell(forIndexPath: indexPath) 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /SwiftyUIKit/UIColor+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK: - UIColor 12 | 13 | extension UIColor { 14 | public typealias RGBA = (r: UInt, g: UInt, b: UInt, a: UInt) 15 | public convenience init(rgba: RGBA) { 16 | self.init( 17 | rgb: (rgba.r, rgba.g, rgba.b), 18 | alpha: CGFloat(rgba.a)/255.0 19 | ) 20 | } 21 | 22 | public typealias RGB = (r: UInt, g: UInt, b: UInt) 23 | public convenience init(rgb: RGB, alpha: CGFloat = 1.0) { 24 | self.init( 25 | red: CGFloat(rgb.r)/255.0, 26 | green: CGFloat(rgb.g)/255.0, 27 | blue: CGFloat(rgb.b)/255.0, 28 | alpha: alpha 29 | ) 30 | } 31 | 32 | public convenience init(hex: UInt64, alpha: CGFloat = 1.0) { 33 | let r = UInt((hex & 0xff0000) >> 16) 34 | let g = UInt((hex & 0x00ff00) >> 8) 35 | let b = UInt((hex & 0x0000ff)) 36 | 37 | self.init(rgb: (r, g, b), alpha: alpha) 38 | } 39 | 40 | public class func randomColor() -> UIColor { 41 | let component = { CGFloat(drand48()) } 42 | return UIColor(red: component(), green: component(), blue: component(), alpha: 1.0) 43 | } 44 | 45 | public var rgbComponents: RGB? { 46 | guard let c = rgbaComponents else { return nil } 47 | 48 | return (r: c.r, g: c.g, b: c.b) 49 | } 50 | 51 | public var rgbaComponents: RGBA? { 52 | guard let c = self.components else { return nil } 53 | 54 | return ( 55 | r: UInt(c.r * 255), 56 | g: UInt(c.g * 255), 57 | b: UInt(c.b * 255), 58 | a: UInt(c.a * 255) 59 | ) 60 | } 61 | 62 | public typealias Components = (r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat) 63 | public var components: Components? { 64 | var r: CGFloat = 0 65 | var g: CGFloat = 0 66 | var b: CGFloat = 0 67 | var a: CGFloat = 0 68 | if self.getRed(&r, green: &g, blue: &b, alpha: &a) { 69 | return (r, g, b, a) 70 | } else { 71 | // Could not extract RGBA components 72 | return nil 73 | } 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /SwiftyUIKit/UIFont+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIFont+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK: - UIFont 12 | 13 | extension UIFont { 14 | public func fontWithSymbolicTraits(_ symbolicTraits: UIFontDescriptorSymbolicTraits) -> UIFont { 15 | let currentDescriptor = fontDescriptor 16 | let descriptor = currentDescriptor.withSymbolicTraits(symbolicTraits) ?? currentDescriptor 17 | return UIFont(descriptor: descriptor, size: 0) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /SwiftyUIKit/UIGestureRecognizer+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIGestureRecognizer+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK: - UIGestureRecognizer 12 | 13 | extension UIGestureRecognizer { 14 | public func removeFromView() { 15 | view?.removeGestureRecognizer(self) 16 | } 17 | 18 | public func cancel() { 19 | // used to clear pending gestures 20 | isEnabled = false 21 | isEnabled = true 22 | } 23 | } 24 | 25 | -------------------------------------------------------------------------------- /SwiftyUIKit/UIImage+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIImage+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK: - UIImage 12 | 13 | extension UIImage { 14 | private static let imagesCache = NSCache() 15 | 16 | public class func cachedImage(contentsOfFile path: String) -> UIImage? { 17 | let cacheKey = path as NSString 18 | if let cached = imagesCache.object(forKey: cacheKey) { 19 | return cached 20 | } 21 | 22 | if let image = UIImage(contentsOfFile: path) { 23 | imagesCache.setObject(image, forKey: cacheKey) 24 | return image 25 | } 26 | 27 | return nil 28 | } 29 | 30 | public class func tiledImage(named name: String) -> UIImage? { 31 | return self.init(named: name)?.resizableImage(withCapInsets: .zero) 32 | } 33 | 34 | public class func imageByRenderingView(_ view: UIView) -> UIImage { 35 | let oldAlpha = view.alpha 36 | view.alpha = 1 37 | let image = imageByRenderingLayer(view.layer) 38 | view.alpha = oldAlpha 39 | 40 | return image 41 | } 42 | 43 | //TODO: use context APIs 44 | 45 | public class func imageByRenderingLayer(_ layer: CALayer) -> UIImage { 46 | UIGraphicsBeginImageContext(layer.bounds.size) 47 | let context = UIGraphicsGetCurrentContext()! 48 | layer.render(in: context) 49 | 50 | let image = UIGraphicsGetImageFromCurrentImageContext()! 51 | UIGraphicsEndImageContext(); 52 | 53 | return image 54 | } 55 | 56 | public class func image(withColor color: UIColor) -> UIImage { 57 | let rect = CGRect(x: 0, y: 0, width: 1, height: 1) 58 | UIGraphicsBeginImageContext(rect.size) 59 | let context = UIGraphicsGetCurrentContext()! 60 | context.setFillColor(color.cgColor) 61 | context.fill(rect) 62 | 63 | let image = UIGraphicsGetImageFromCurrentImageContext()! 64 | UIGraphicsEndImageContext() 65 | 66 | return image 67 | } 68 | 69 | public func image(withOrientation orientation: UIImageOrientation) -> UIImage? { 70 | if let cgImage = self.cgImage { 71 | return UIImage(cgImage: cgImage, scale: scale, orientation: orientation) 72 | } else if let ciImage = self.ciImage { 73 | return UIImage(ciImage: ciImage, scale: scale, orientation: orientation) 74 | } else { 75 | return nil 76 | } 77 | } 78 | 79 | public func verticallyMirrored() -> UIImage? { 80 | return image(withOrientation: imageOrientation.verticallyMirrored) 81 | } 82 | 83 | public func horizontallyMirrored() -> UIImage? { 84 | return image(withOrientation: imageOrientation.horizontallyMirrored) 85 | } 86 | } 87 | 88 | // MARK: - UIImageOrientation 89 | 90 | extension UIImageOrientation { 91 | public var verticallyMirrored: UIImageOrientation { 92 | switch (self) { 93 | case .up: return .downMirrored; 94 | case .down: return .upMirrored; 95 | case .left: return .leftMirrored; 96 | case .right: return .rightMirrored; 97 | case .upMirrored: return .down; 98 | case .downMirrored: return .up; 99 | case .leftMirrored: return .left; 100 | case .rightMirrored: return .right; 101 | } 102 | } 103 | 104 | public var horizontallyMirrored: UIImageOrientation { 105 | switch (self) { 106 | case .up: return .upMirrored; 107 | case .down: return .downMirrored; 108 | case .left: return .rightMirrored; 109 | case .right: return .leftMirrored; 110 | case .upMirrored: return .up; 111 | case .downMirrored: return .down; 112 | case .leftMirrored: return .right; 113 | case .rightMirrored: return .left; 114 | } 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /SwiftyUIKit/UIImageView+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIImageView+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK: - UIImageView 12 | 13 | extension UIImageView { 14 | public convenience init?(imageNamed name: String) { 15 | self.init(image: UIImage(named: name)) 16 | } 17 | 18 | public var imageOrientation: UIImageOrientation? { 19 | get { return image?.imageOrientation } 20 | set { image = newValue.flatMap { image?.image(withOrientation: $0) } } 21 | } 22 | 23 | public func mirrorVertically() { 24 | image = image?.verticallyMirrored() 25 | } 26 | public func mirrorHorizontally() { 27 | image = image?.horizontallyMirrored() 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /SwiftyUIKit/UITableView+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITableView+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK: - UITableView 12 | 13 | extension UITableView { 14 | public var numberOfRows: Int { 15 | return (0..() -> T? { 39 | return dequeueReusableCell(withIdentifier: T.cellIdentifier) as? T 40 | } 41 | 42 | public func dequeueReusableCell(forIndexPath indexPath: IndexPath) -> T { 43 | return dequeueReusableCell(withIdentifier: T.cellIdentifier, for: indexPath) as! T 44 | } 45 | 46 | public func dequeueReusableHeaderFooterView() -> T? { 47 | return self.dequeueReusableHeaderFooterView(withIdentifier: T.defaultIdentifier) as? T 48 | } 49 | } 50 | 51 | // MARK: - UITableViewCell 52 | 53 | extension UITableViewCell { 54 | public static var cellIdentifier: String { 55 | return className 56 | } 57 | 58 | public class func dequeueReusableCell(fromTableView tableView: UITableView) -> Self? { 59 | return tableView.dequeueReusableCell() 60 | } 61 | 62 | public class func dequeueReusableCell(fromTableView tableView: UITableView, indexPath: IndexPath) -> Self { 63 | return tableView.dequeueReusableCell(forIndexPath: indexPath) 64 | } 65 | } 66 | 67 | // MARK: - UITableViewHeaderFooterView 68 | 69 | extension UITableViewHeaderFooterView { 70 | public static var defaultIdentifier: String { 71 | return className 72 | } 73 | 74 | public class func dequeue(fromTableView tableView: UITableView) -> Self? { 75 | return tableView.dequeueReusableHeaderFooterView() 76 | } 77 | 78 | public class func registerNib(inTableView tableView: UITableView, bundle: Bundle? = nil) { 79 | let nib = UINib(nibName: defaultIdentifier, bundle: bundle) 80 | tableView.register(nib, forHeaderFooterViewReuseIdentifier: defaultIdentifier) 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /SwiftyUIKit/UIView+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK: - UIView 12 | 13 | extension UIView { 14 | public func removeSubviews() { 15 | for subview in subviews { 16 | subview.removeFromSuperview() 17 | } 18 | } 19 | 20 | public class func fromNib(named name: String) -> Self? { 21 | let allObjects = Bundle.main.loadNibNamed(name, owner: nil, options: nil) ?? [] 22 | return castFirst(allObjects) 23 | } 24 | 25 | public class func fromNib() -> Self? { 26 | return fromNib(named: className) 27 | } 28 | 29 | public func applyContainedViewConstraints() { 30 | translatesAutoresizingMaskIntoConstraints = false 31 | superview?.addConstraints(containedViewConstraints()) 32 | } 33 | 34 | public func containedViewConstraints() -> [NSLayoutConstraint] { 35 | let views = ["self": self] 36 | let formats = ["V:|[self]|", "H:|[self]|"] 37 | 38 | return NSLayoutConstraint.constraints(withVisualFormats: formats, options: [], metrics: nil, views: views) 39 | } 40 | 41 | public func containedViewConstraints(withHeight height: CGFloat) -> [NSLayoutConstraint] { 42 | let views = ["self": self] 43 | let metrics = ["height": height] 44 | let formats = ["V:|[self(height)]", "H:|[self]|"] 45 | 46 | return NSLayoutConstraint.constraints(withVisualFormats: formats, options: [], metrics: metrics, views: views) 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /SwiftyUIKit/UIViewController+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+Extensions.swift 3 | // SwiftySwift 4 | // 5 | // Created by Agustin De Cabrera on 5/18/16. 6 | // Copyright © 2016 Agustín de Cabrera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK: - UIViewController 12 | 13 | extension UIViewController { 14 | public class func fromStoryboard(named name: String, identifier: String) -> UIViewController? { 15 | return fromStoryboard(UIStoryboard(name: name, bundle: nil), identifier: identifier) 16 | } 17 | public class func fromStoryboard(_ storyboard: UIStoryboard, identifier: String) -> UIViewController? { 18 | return storyboard.instantiateViewController(withIdentifier: identifier) 19 | } 20 | 21 | public class func fromStoryboard(named name: String) -> Self? { 22 | return fromStoryboard(UIStoryboard(name: name, bundle: nil)) 23 | } 24 | public class func fromStoryboard(_ storyboard: UIStoryboard) -> Self? { 25 | return controllerFromStoryboard(storyboard) 26 | } 27 | } 28 | 29 | private func controllerFromStoryboard(_ storyboard: UIStoryboard) -> T? { 30 | return T.fromStoryboard(storyboard, identifier: T.className) as? T 31 | } 32 | --------------------------------------------------------------------------------