{"id":20852615,"url":"https://github.com/eleev/extensions-kit","last_synced_at":"2025-12-12T06:17:04.791Z","repository":{"id":33083823,"uuid":"131512294","full_name":"eleev/extensions-kit","owner":"eleev","description":"📦 Collection of Swift+Apple Frameworks extensions for speeding up software development [iOS \u0026 iPadOS].","archived":false,"fork":false,"pushed_at":"2022-04-19T17:07:43.000Z","size":582,"stargazers_count":79,"open_issues_count":1,"forks_count":5,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-05-08T15:02:09.512Z","etag":null,"topics":["extensions","foundation","framework","ios","ios-extensions","ios-sdk","ios-swift","ios-ui","productivity","spm","swift","swift-extensions","swift-framework","swift-package-manager","uikit","uiview","utility-library"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eleev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-04-29T16:51:27.000Z","updated_at":"2025-04-23T14:32:01.000Z","dependencies_parsed_at":"2022-08-07T20:00:16.222Z","dependency_job_id":null,"html_url":"https://github.com/eleev/extensions-kit","commit_stats":null,"previous_names":["jvirus/extensions-kit"],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eleev%2Fextensions-kit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eleev%2Fextensions-kit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eleev%2Fextensions-kit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eleev%2Fextensions-kit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eleev","download_url":"https://codeload.github.com/eleev/extensions-kit/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253681886,"owners_count":21946823,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["extensions","foundation","framework","ios","ios-extensions","ios-sdk","ios-swift","ios-ui","productivity","spm","swift","swift-extensions","swift-framework","swift-package-manager","uikit","uiview","utility-library"],"created_at":"2024-11-18T03:18:13.327Z","updated_at":"2025-12-12T06:17:04.729Z","avatar_url":"https://github.com/eleev.png","language":"Swift","readme":"# extensions-kit [![Awesome](https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg)](https://github.com/sindresorhus/awesome)\n\n[![Build](https://github.com/jvirus/extensions-kit/workflows/Build/badge.svg)]()\n[![Platforms](https://img.shields.io/badge/Platforms-iOS-yellow.svg)]()\n[![Language](https://img.shields.io/badge/Language-Swift-orange.svg)]()\n[![SPM](https://img.shields.io/badge/SPM-Supported-lightblue.svg)]()\n[![Extensions](https://img.shields.io/badge/Extensions-246-red.svg)]()\n[![CustomTypes](https://img.shields.io/badge/Types-24-green.svg)]()\n[![NLOC](https://img.shields.io/tokei/lines/github/jvirus/extensions-kit)]()\n[![License](https://img.shields.io/badge/License-MIT-blue.svg)]()\n\n\u003c!-- [![Build Status](https://travis-ci.org/jVirus/extensions-kit.svg?branch=master)](https://travis-ci.org/jVirus/extensions-kit) --\u003e\n\u003c!--[![Coverage](https://codecov.io/gh/jVirus/extensions-kit/branch/master/graph/badge.svg)](https://codecov.io/gh/jVirus/extensions-kit) --\u003e\n\n\u003c!-- [![Status](https://img.shields.io/badge/status-Alpha-magenta.svg)]() --\u003e\n\n\u003c!-- The presented platforms are supported yet. This badge will be needed as soon as the platforms are actually supported --\u003e\n\u003c!-- [![Platforms](https://img.shields.io/badge/platforms-iOS%20%7C%20macOS%20%7C%20tvOS%20%7C%20watchOS-yellow.svg)]() --\u003e\n\n\u003c!-- Coverage was updated manually, which is ok, but CI needs to handle this task --\u003e\n\u003c!-- [![Coverage](https://img.shields.io/badge/coverage-23%2C30%25-red.svg)]() --\u003e\n\n\u003c!-- Documentation coverage also needs to be handled by CI --\u003e\n\u003c!-- [![Documentation](https://img.shields.io/badge/docs-100%25-magenta.svg)]() --\u003e\n\n**Last Update: 22/April/2022.**\n\n![](logo-extensions_kit.png)\n\n### If you like the project, please give it a star ⭐ It will show the creator your appreciation and help others to discover the repo.\n\n# ✍️ About\n\n📦 Collection of Swift extensions(+ custom types) for various use cases.\n\n# 🏗 Installation\n## Swift Package Manager\n\n### Xcode 11+\n\n1. Open `MenuBar` → `File` → `Swift Packages` → `Add Package Dependency...`\n2. Paste the package repository url `https://github.com/jVirus/extensions-kit` and hit `Next`.\n3. Select the installment rules.\n\nAfter specifying which version do you want to install, the package will be downloaded and attached to your project. \n\n### Package.swift\nIf you already have a `Package.swift` or you are building your own package simply add a new dependency:\n\n```swift\ndependencies: [\n    .package(url: \"https://github.com/jVirus/extensions-kit\", from: \"1.0.0\")\n]\n```\n## Manual\nYou can always use `copy-paste` the sources method 😄.\n\n# 🍱 Categories\nList of categories for convenient navigation. The `numbers` represent total number of extensions for a given category + custom types. Each extension file may contain a number of extensions, grouped by a category.\n\n- [AVFoundation - 1](#avfoundation) \n- [Core Animation - 1](#core-animation)\n- [Core Graphics - 16](#core-graphics)\n- [Core Image - 6](#core-image)\n- [Foundation - 146](#foundation)\n- [UIKit - 66](#uikit)\n- [os - 1](#os)\n- [SpriteKit - 11](#spritekit)\n- [SceneKit - 2](#scenekit)\n- [PhotoKit - 1](#photokit)\n- [concurrency-kit - for `GCD` extensions + even more](https://github.com/jVirus/concurrency-kit)\n\n\u003c!--\n# 📚 List of Extensions\nAll the extensions are split into separete `groups` each of which represents a separete `SDK framework`. \n\n\n## AVFoundation\n#### [AVCaptureDevice+ToggleFlash](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/AVFoundation/AVCaptureDevice%2BToggleFlash.swift)\nAdds support for easy flashlight management:\n\n```swift\nAVCaptureDevice.toggleFlashlight(with: .max)\n```\n\n## Core Animation\n\n### CAAnimation\n#### [CAAnimation+PatternReplicator](/extensions-kit/Extensions/CoreAnimation/CAAnimation/CAAnimation%2BPatternReplicator.swift)\nCreates a pattern-based, wavy animation for the specified image, layer size and other properties:\n\n```swift\nCAAnimation.patternReplocator(with: UIImage(\"image\"), size: CGSize(width: 600, height: 600), targetLayer: drawerView.layer)\n```\n\n## Core Graphics\n\n### CGSize \n#### [CGSize+Operators](/extensions-kit/Extensions/CoreGraphics/CGSize/CGSize%2BOperators.swift)\nVarious mathematical operators such as `+`, `-`, `*`, `/` for convenience:\n\n```swift\nCGSize(width: 10, height: 20) + CGSize(width: 25.4, height: 23.6)\nCGSize(width: 10, height: 20) - CGSize(width: 25.4, height: 23.6)\nCGSize(width: 10, height: 20) * CGSize(width: 25.4, height: 23.6)\nCGSize(width: 10, height: 20) / CGSize(width: 25.4, height: 23.6)\n```\n\n### CGPoint\n#### [CGPoint+Operators](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/CoreGraphics/CGPoint/CGPoint%2BOperators.swift)\nVarious mathematical operators such as `+`, `-`, `*`, `/`, `lerp` etc.:\n\n```swift\nvar origin: CGPoint = .zero\nlet addPoint = origin + CGPoint(x: 10, y: 3)\norigin += CGPoint(x: 12, y: 5)\nlet subPoint = origin - CGPoint(x: 12, y: 5)\n        \nlet interpolatedPoint = CGPoint.lerp(start: pointOne, end: pointTwo, t: 2)\n```\n\n#### [CGPoint+Utils](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/CoreGraphics/CGPoint/CGPoint%2BUtils.swift) \nMissing mathematical utilities such as `normalized`, `lenght`, `distanceTo` and `angle`:\n\n```swift\nlet point = CGPoint(x: 3, y: 5)\nlet _ = point.length()\nlet _ = point.angle\nlet _ = point.normalized()\nlet distanceBetweenTwoPoints = point.distanceTo(anotherPoint)\nlet _ = point.lengthSquared()\n```\n\n### CGRect\n\n#### [CGRect+Scale](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/CoreGraphics/CGRect/CGRect%2BScale.swift)\nScales `self` to the specified size:\n\n```swift\nlet rect = CGRect(origin: .zero, size: CGSize(width: 100, height:\n            200))\nlet newSize = rect.scaled(to: targetSize)\n```\n\n#### [CGRect+Corners](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/CoreGraphics/CGRect/CGRect%2BCorners.swift)\nAdds properties for `topLeft`, `topRight`, `bottomLeft` and `bottomRight` points:\n\n```swift\nlet rect = CGRect(origin: .zero, size: CGSize(width: 100, height:\n            200))\nrect.topLeft\nrect.topRight\nrect.bottomLeft\nrect.bottomRight\n````\n\n#### [CGRect+Mid](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/CoreGraphics/CGRect/CGRect%2BMid.swift)\nAdds property for `mid` point of `self`:\n\n```swift\nlet rect = CGRect(origin: .zero, size: CGSize(width: 100, height:\n            200))\nrect.mid\n```\n\n#### [CGRect+AspectFit](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/CoreGraphics/CGRect/CGRect%2BAspectFit.swift)\nAdds `aspectFit(inRect: CGRect) -\u003e CGRect` method that scales `self` to fit the specified `CGRect`:\n\n```swift\nlet rect = CGRect(origin: .zero, size: CGSize(width: 100, height:\n            200))\nrect.aspectFit(inRect: targetRect)\n```\n\n### CGFloat\n#### [CGFloat+Rounded](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/CoreGraphics/CGFloat/CGFloat%2BRounded.swift)\nRounds `self` to the specified decimal places:\n\n```swift\nlet val: CGFloat = 4.32\nlet roundedVal = val.rounded(toPlaces: 1) // roundedVal holds `4.3`\n```\n\n## CoreImage\n\n### New Filters\n#### [HighlightFilter](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/CoreImage/Filters/HighlightFilter.swift) \nFilter is originally designed for highlighting 3D objects but can be used to add this effect to images and sprites.\n\n### CIImage\n#### [CIImage+Inverted](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/CoreImage/CIImage%2BInverted.swift)\nInverts the colors of `self`:\n\n```swift\nlet invertedImage = ciImage.inverted\n// invertedImage holds the same image data but with inverted colors\n```\n\n#### [CIImage+QRImage](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/CoreImage/CIImage%2BQRImage.swift)\nGenerates a QR image from the input `text` and with an optional `scale` parameter that specifies the affine transformation for the output `CIImage`:\n\n```swift\nlet helloWorldQRImage = CIImage.qrImage(from: \"Hello World!\")\n// helloWorldQRImage holds image data that represents QR code for `Hello World!` message\n```\n\n#### [CIImage+Tinted](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/CoreImage/CIImage%2BTinted.swift)\nApplies the specified `color` as a tint color:\n\n```swift\nlet redQRImage = qrImage.tinted(by: .red)\n// redQRImage holds the same QR image data as before but tinted by red color\n```\n\n#### [CIImage+Transparent](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/CoreImage/CIImage%2BTransparent.swift)\nA number of extensions that convert the target `CIImage` instance to it's transparent version by applying alpha masking filter:\n\n```swift\nlet transparentImage = ciImage.transparent\nlet blackTransparentImage = anotherImage.blackTransparent\n```\n\n## Foundation\n\n### NSObjectProtocol\n#### [NSObjectProtocol+KVO+KVC](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/NSObjectProtocol/NSObjectProtocol%2BKVO%2BKVC.swift)\nObserve and bind observables with ease:\n\n```swift\n// Binding is as easy as writing just a single line of code:\nviewModel.bind(\\.progressSlider, to: progressSlider, at: \\.value)\n\n// Observing for changes is thinner than the `Swifts 4.0` updated `KVO`:\nviewModel.observe(\\.buttonTitle) { [button] in\n        button!.setTitle($0, for: .normal)\n}\n```\n\n### Custom Protocols\n#### [Identifiable](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/CustomProtocols/Identifiable.swift)\nThe protocol supposed to be used with types that need identification, such as UITableViewCell, UITableViewHeaderFooterView, UICollectionReusableView etc.:\n\n```swift\nclass FeedTableViewCell: UITableViewCell, Identifiable {\n       // ... \n       // Implementation details\n       // ... \n}\n\n// Somewhere in `UITableViewControllerDelegate`:\nlet cell = dequeueReusableCell(withIdetifier: cell. reuseIdentifier)\n```\n\n#### [Then](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/CustomProtocols/Then.swift)\nProtocol for object configuration:\n\n```swift\nvar imageView = UIImageView().then {\n        $0.layer.cornerRadius = 10\n        $0.contentMode = .scaleAspectFill\n        $0.clipsToBounds = true\n}\n```\n\n### Custom Types\n#### [Variable](/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/CustomStructures/Variable.swift) \nLightweight bindable data type that allows to get on update notifications for a given value. Can be used with `MVVM` or any another architectural pattern to replace the need for 3rd party, heavyweight binding framework:\n\n```swift\nlet stringVariable = Variable(\"Initial Value\")\nlet newValue = \"New Value\"\nstringVariable.value = newValue\n\nstringVariable.onUpdate = {\n        let isEqual = $0 == newValue\n        XCTAssert(isEqual)\n}\n```\n\n#### [Debouncer](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/CustomStructures/Debouncer.swift)\nAllows an action to be performed after a delay:\n\n```swift\nlet debouncer = Debouncer(delay: 2.0)\ndebouncer.schedule {\n        value = \"Changed Value\"            \n}\n// After 2.0 seconds the value will be changed to \"Changed Value\"\n```\n\n#### [ObservableArray](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/CustomTypes/ObservableArray.swift)\nSyncronous, thread-safe observable array type:\n\n```swift\nlet array: ObservableArray = [1,2,3,4,5]\narray += 6\narray += [7,8]\n\narray.allChanges = { change in\n        // Both changes will, for addition of `6` and `[7,8]` will be reflected in `change` property and the appropriate callbacks will be made\n}\n\narray.removeFirst()\narray.removeLast()\narray.remove(at: 4)\n```\n\n### Custom TextOutputStream\n#### [FileOutputStream](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Custom%20TextOutputStream/FileOutputStream.swift)\nPrints the output stream to the specified file for the given `URL` and `encoding`:\n\n```swift\nlet url = URL(fileURLWithPath: \"/somePath/subpath/file.rtf\")\nlet fileHandle = try FileHandle(forWritingTo: url)\nvar textOutputStream = TextOutputStream(fileHandle)\n\nprint(\"\\(outputString)\", \u0026textOutputStream)\n// The print statement will write the output stream to the specified FileHandle at the specified URL. This stream mimics Java's SDK File Output Stream. \n```\n\n#### [](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Custom%20TextOutputStream/UnicodeOutputStream.swift)\n Prints all the `Unicode` characters with the following scheme:\n\n```swift\nvar unicodeOutputStream = UnicodeOutputStream()\nprint(\"👨‍👩‍👧‍👧\", to: \u0026unicodeOutputStream)\n\n// Will print all the unicode indices + characters + names\n```\n\n### Functions \n#### [FunctionalComposition](/extensions-kit/Extensions/Foundation/Functions/FunctionalComposition.swift)\nIs a number of functions that implement `Functional Composition` concept which allows to combine multiple functions and chain them together, in order to transform data. Consider the following construction: (`doubleNumbers` -\u003e\u003e `squareNumbers` -\u003e\u003e `convertToStringArray`)(array) which returns a processed array by linearly composing the functions (rather that nesting the function calls). Also the extension includes the `reversed` operator that composes functions in reversed order:\n\n```swift\nfunc double\u003cT: Numeric\u003e(array: [T]) -\u003e [T] {\n        return array.map { $0 * 2 }\n}\n        \nfunc square\u003cT: Numeric\u003e(array: [T]) -\u003e [T] {\n        return array.map { $0 * $0 }\n}\n        \nfunc toStringArray\u003cT: Numeric\u003e(array: [T]) -\u003e [String] {\n        return array.map { \"\\($0)\" }\n}\n\nlet data = [1,2,3,4,5]\nlet newData = (double -\u003e\u003e square -\u003e\u003e toStringArray)(data)        \n// newData now equals to [\"4\", \"16\", \"36\", \"64\", \"100\"]\n```\n\n### Data Structures\n#### [BuilderProtocol](/extensions-kit/Extensions/Foundation/DataStructures/Builder/BuilderProtocol.swift)\nAllows `AnyObject` to be extended with chainable initialization methods by using Keypath feature. Please note that the extension works only since `Swift 4.0`:\n\n```swift\n// 1. Add conformance to BuilderProtocol\nextension Song: BuilderProtocol { /* empty implementation */ }\n\n// 2. Then you can use Key-Path builder approach:\nlet song = Song()\n        .init(\\.author,         with: author)\n        .init(\\.name,           with: name)\n        .init(\\.genre,          with: genre)\n        .init(\\.duration,       with: duration)\n        .init(\\.releaseDate,    with: releaseDate)\n```\n\n#### [Lens](/extensions-kit/Extensions/Foundation/DataStructures/FunctionalLenses/Lens.swift)\n`Lens` is an implementation of `Functional Lenses` concept that allows to safely modify immutable `structs` and provides fundamental tools to work with complex data structures (see `UnitTests`):\n\n```swift\nextension Actor {\n    struct Lenses {\n        static let name = Lens\u003cActor, String\u003e(\n            get: {$0.name},\n            set: {(me, value) in Actor(name: value, surname: me.surname) }\n        )\n        static let surname = Lens\u003cActor, String\u003e(\n            get: {$0.surname},\n            set: {(me, value) in Actor(name: me.name, surname: value) }\n        )\n    }\n}\n\nextension Movie {\n    struct Lenses {\n        static let mainActor = Lens\u003cMovie, Actor?\u003e(get: { movie in\n            let actor: Actor? = movie.actors.first\n            return actor\n        }, set: { me, actor -\u003e Movie in\n            guard let actor = actor else { return me }\n            \n            return Movie(name: me.name, year: me.year, actors: [actor] + me.actors)\n        })\n    }\n}\n```\n\n#### [ObjectPool](/extensions-kit/Extensions/Foundation/DataStructures/ObjectPool/ObjectPool.swift) \nThread-safe implementation of `ObjectPool` design pattern:\n\n```swift\nlet objectPool = ObjectPool(objects: [resource, anotherResource, thirdResource])\nlet reusedResource = objectPool.dequeue()\nobjectPool.enqueue(object: reusedResource)\nobjectPool.eraseAll()\n```\n\n#### [Observer](/extensions-kit/Extensions/Foundation/DataStructures/Observer/) \nThread-safe implementation of `Observer` design pattern (don't confuse with NotiifcationCenter - it's an implementation of `Publish-Subscribe` pattern):\n\n```swift\nlet observerOne = ObserverOne()\nvar observerTwo: ObserverTwo? = ObserverTwo()\nlet observerThree = ObserverThree()\n\nlet subject = Subject()\nsubject += [observerOne, observerTwo!, observerThree]\n\nsubject ~\u003e EmailNotification(message: \"Hello Observers, this messag was sent from the Subject!\")\n\n// Will produce the following output:\n// \n// Observer One:  data: Optional(\"Hello Observers, this messag was sent from the Subject!\")\n// Observer Two:  data: Optional(\"Hello Observers, this messag was sent from the Subject!\")\n// Observer Three:  data: Optional(\"Hello Observers, this messag was sent from the Subject!\")\n```\n\n#### [MulticastDelegation](/extensions-kit//Extensions/Foundation/DataStructures/MulticastDelegation/MulticastDelegation.swift)\nNon thread-safe implementation of `MulticastDelegation` design pattern:\n\n```swift\n// Create the view controllers that will be delegates\nlet containerViewController = ContainerViewController()\nlet profileViewController = ProfileViewController()\n\nlet profileModel = ProfileModel()\n\n// Attach the delegates\nprofileModel.delegates.add(delegate: containerViewController)\nprofileModel.delegates.add(delegate: profileViewController)\n\n// Change the model\nprofileModel.name = \"John\"\n\n// After changing `name` property we got the following in console:\n// ContainerViewControllers:  didUpdate(name:)  value:  John\n// ProfileViewController:  didUpdate(name:)  value:  John\n\n// Assume that we needed to remove one of the delegates:\nprofileModel.delegates.remove(delegate: profileViewController)\n\n// And again update the model:\nprofileModel.city = \"New York\"\n// This time the console outputs is the following:\n// ContainerViewControllers:  didUpdate(city:)  value:  New York\n\n// We again attach ProfileViewController\nprofileModel.delegates.add(delegate: profileViewController)\n\n// Custom closure that is called outside of the model layer, for cases when something custom is required without the need to touch the original code-base. For instance we may implement this function in our view-model layer when using MVVM architecture\nprofileModel.delegates.update { modelDelegate in\n    modelDelegate.didSave()\n}\n```\n\n#### [Stack](/extensions-kit//Extensions/Foundation/DataStructures/Stack/Stack.swift) \nIs an implementation of `Stack` data structure:\n\n```swift\nvar stack: Stack = [1,2,3,4,5,6,7,8,1]\nlet lastElement = stack.pop()\nstack.push(element: 10)\n```\n\n#### [Queue](/extensions-kit//Extensions/Foundation/DataStructures/Queue/Queue.swift) \nIs an implementation of `Queue` data structure:\n\n```swift\nvar queue: Queue = [1,2,3,4,5,6,7,8,1]\nqueue.enqueue(element: 9)\nlet dequeuedElement = queue.dequeue()\n```\n\n#### [ProrityQueue](/extensions-kit/Extensions/Foundation/DataStructures/PriorityQueue/PriorityQueue.swift) \nIs an implementation of `Prority Queue` data structure based on `Heap` data structure:\n\n```swift\nvar queue = PriorityQueue\u003cInt\u003e(elements: [2, 1, 4, 3, 5], order: \u003e)\nqueue.enqueue(9)\n```\n\n#### [Dequeue](/extensions-kit//Extensions/Foundation/DataStructures/Dequeue/Dequeue.swift) \nIs an implementation of `Dequeue` data structure:\n\n```swift\nvar dequeue = Dequeue([1,2,34,5,6,7])\nlet back = dequeue.dequeueBack()\nlet front = dequeue.dequeueFront()\n\ndequeue.enqueue(front: 99)\ndequeue.enqueue(back: 99)\n```\n\n#### [LinkedList](/extensions-kit//Extensions/Foundation/DataStructures/LinkedList/LinkedList.swift)\nIs an implementation of `Linked List` data structure:\n\n```swift\nvar list: LinkedList = [1,2,4,5]\nlist.pop()\n\nvar newList = LinkedList\u003cInt\u003e(sequence: list)\nnewList.pop()\n```\n\n#### [DoublyLinkedList](/extensions-kit//Extensions/Foundation/DataStructures/DoublyLinkedList/DoublyLinkedList.swift) \nIs an implementation of `Doubly Linked List` data structure:\n\n```swift\nvar list: DoublyLinkedList = [1,2,4,5,6,7]\nlist.head\nlist.tail\n\nlist.removeHead()\nlist.removeTail()\n\nlist.push(newHead: 99)\nlist.push(newTail: 101)\n```\n\n#### [Heap](/extensions-kit//Extensions/Foundation/DataStructures/Heap/Heap.swift) \nIs an implementation of `Heap` data structure:\n\n```swift\nvar maxHeap = Heap\u003cInt\u003e(order: \u003e)\nmaxHeap.insert(node: 1)\nmaxHeap.insert(node: 5)\nmaxHeap.insert(node: 2)\nmaxHeap.insert(node: 7)\nmaxHeap.insert(node: 9)\n\nmaxHeap.index(of: 3)\nlet sortedHeapmaxHeap.sorted()\n```\n\n### Extensions\n\n### Array\n#### [Array+Filtering](/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Array/Array%2BFiltering.swift) \nContains a number of methods for filtering in a `functional-style`, has `skip`, `all` and `any` filters\n\n```swift\nlet result = [1,2,3,4,5,6,7,8,9,10].skip(5)\n// result array contains all the elements except the first 5 e.g. [6,7,8,9,10]\n\nlet result = [1,2,3,4,5,6,7,8,9,10].all { $0 \u003c 20 }\n// result will be true since all the elements are less than 20\n\nlet result = [1,2,3,4,5,6,7,8,9,10].any { $0 \u003c 5 }\n// result will be true since there are a number of elements that are less than 5\n```\n\n#### [Array+Contains](/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Array/Array%2BContains.swift) \nChecks if self contains the specified elements\n\n```swift\nlet result = [1,2,4,5,6,7,8,9,10].contains(elements: 1,2,4,5)\n// result will be true since the target array contains all the specified elements\n\nlet result = [1,2,4,5,6,7,8,9,10].contains(elements: 9,10,11,12)\n// result will be false since the target array does not contain 11 and 12\n```\n\n#### [Array+Difference](/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Array/Array%2BDifference.swift) \nComputes differences between self and the input arrays\n\n```swift\nlet testA = [1,2,3,4,5]\nlet testB = [4,5,7,8,9]\n\nlet result = testA.difference(elements: testB)\n// result will be [1,2,3]\n\nlet result = testB.difference(elements: testA)\n// result will be [7,8,9]\n```\n\n#### [Array+Intersection](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Array/Array%2BIntersection.swift) \nComputes intersection of self and the input values\n\n```swift\nlet testA = [1,2,3,4,5]\nlet testB = [4,5,6,7]\n\nlet result = testA.intersection(values: testB)\n// result will be [4,5]\n```\n\n#### [Array+Union](/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Array/Array%2BUnion.swift) \nUnions self and the input arrays\n\n```swift\nlet result = [1,2,4,5,6,7,8].union(value: [8,9,10])\n// result will be [1, 2, 4, 5, 6, 7, 8, 9, 10]\n```\n\n#### [Array+Remove](/extensions-kit/Extensions/Foundation/Array/Array%2BRemove.swift) \nA set of methods that remove `Element` form an array by mutating it\n\n```swift\nvar test = [1,2,3,4,5,6,7,8]\n\ntest.remove(object: 8)\n// test contains the following elements [1,2,3,4,5,6,7]\n\ntest.remove(objects: [1,2,4])\n// test contains the following elements [3,5,6,7]\n\ntest.remove(objects: 5,6)\n// test contains the following elements [3,7]\n```\n\n#### [Array+InsertionSort](/extensions-kit/Extensions/Foundation/Array/Array%2BIntersection.swift) \nAdds support for `Insertion Sort` algorithm\n\n#### [Array+MergeSort](/extensions-kit/Extensions/Foundation/Array/Array%2BMergeSort.swift) \nAdds support for `Merget Sort` algorithm\n\n#### [Array+QuickSortHoareScheme](/extensions-kit/Extensions/Foundation/Array/Array%2BQuickSortHoareScheme.swift) \nAdds support for `Quick Sort` algorithms using `Hoare's` partitioning scheme \n\n#### [Array+QuickSortLomutoScheme](/extensions-kit/Extensions/Foundation/Array/Array%2BQuickSortLomutoScheme.swift) \nAdds support for `Quick Sort` algorithm using `Lomuto's` partitioning scheme \n\n#### [Array+BubbleSort](/extensions-kit/Extensions/Foundation/Array/Array%2BBubbleSort.swift) \nAdds support for `Bubble Sort` algorithm\n\n#### [Array+ShellSort](/extensions-kit/Extensions/Foundation/Array/Array%2BShellSort.swift) \nAdds support for `Shell Sort` algorithm\n\n#### [Array+RadixSort](/extensions-kit/Extensions/Foundation/Array/Array%2BRadixSort.swift) \nAdds support for `Radix Sort` algoritm\n\n### Bool\n#### [Bool+Int](/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Bool/Bool%2BInt.swift) \nAdds a property that returns `Int` representation of `self`\n\n#### [Bool+Random](/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Bool/Bool%2BRandom.swift) \nAdds a random property for `self`\n\n### ClosedRange\n#### [ClosedRange+Random](/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/ClosedRange/ClosedRange%2BRandom.swift) \nAdds a property that generates a random `Int` with respect to `self`\n\n### Collection \n#### [Collection+ParallelIteration](/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Collection/Collection%2BParallelIteration.swift) \nAdds `parallelForEach` method \n\n#### [Collection+RandomItem](/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Collection/Collection%2BRandomItem.swift) \nAdds a property that returns a random element from `self`\n\n#### [Collection+Sum\u0026Average](/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Collection/Collection%2BSum%26Average.swift)  \nAdds two properties for `sum` and `average` with the corresponding functionality\n\n#### [Collection+SafeSubscript](/extensions-kit/Extensions/Foundation/Collection/Collection%2BSafeSubscript.swift) \nSafely checks whether the collection is able to retreive an element for the given Index, otherwise it will return nil\n\n### RandomAccessCollection\n#### [RandomAccessCollection+BinarySearch](/extensions-kit/Extensions/Foundation/RandomAccessCollection/RandomAccessCollection%2BBinarySearch.swift) \nImplementation of `Binary Search` algorithm \n\n### Decodable\n#### [Decodable+DecodeFromFile](/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Decodable/Decodable%2BDecodeFromFile.swift) \nDecodes a file into a type:\n\n```swift\n// User is a .json file containing the following data:\n// {\n//    \"name\":\"Willy\",\n//    \"age\":30\n// }\n\nlet decodedUser = try? User.decodeFromFile(named: \"User\")\n// decodedUser will be a Decodable struct named User with two properties for name and age\n```\n\n### Dictionary\n#### [Dictionary+GetOrAddValue](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Dictionary/Dictionary%2BGetOrAddValue.swift) \nParses `self` as `JSON` to `Data` or `String`\n\n#### [Dictionary+JSON](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Dictionary/Dictionary%2BJSON.swift) \nChecks for a value for a given key or creates a new key/value pair if none was found\n\n#### [Dictionary+ConvenienceWrappers](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Dictionary/Dictionary%2BConvenienceWrappers.swift) \nAdds wrappers around common operations such as `has(key: )-\u003eBool` and `each(: (Key, Value)-\u003e())`\n\n#### [Dictionary+Difference](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Dictionary/Dictionary%2BDifference.swift) \nComputes differences between self and the input dictionaries \n\n#### [Dictionary+Intersection](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Dictionary/Dictionary%2BIntersection.swift) \nComputes intersection of self and the input Dictionaries\n\n#### [Dictionary+Map](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Dictionary/Dictionary%2BMap.swift) \nCustom mapping function\n\n#### [Dictionary+Union](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Dictionary/Dictionary%2BUnion.swift) \nUnions self and the input dictionaries\n\n### Double\n#### [Double+Rounded](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Double/Double%2BRounded.swift) \nRounds `self` to decimal places value\n\n#### [Double+CurrencyShorcuts](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Double/Double%2BCurrencyShortcuts.swift) \nAdds several commonly used currency shortcuts as properties\n\n### Date\n#### [Date+FirstLast](/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Date/Date%2BFirstLast.swift) \nAdds a number of properties that allow to quickly access: `first day of a week`, `start of a day`, `end of a day` and a `number of days in a month`\n\n#### [Date+PreviousNext](/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Date/Date%2BPreviousNext.swift)\nAdds properties that allow to get access to the `previous` and `next` days\n\n### Float \n#### [Float+Rounded](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Float/Float%2BRounded.swift) \nRounds `self` to decimal places value\n\n### Int\n#### [Int+Clamp](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Int/Int%2BClamp.swift) \nClamps `self` into a range that can be described using `ClosedRange` or two separate properties\n\n#### [Int+Digits](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Int/Int%2BDigits.swift) \nAdds `digitCount` property that contains the number of digits for `self`\n\n#### [Int+EvenOdd](https://github.com/jVirus/ios-extensions/blob/master/extensions-kit/Extensions/Foundation/Int/Int%2BEvenOdd.swift) \nChecks whether `self` is even or if it's odd\n\n#### [Int+Factorial](https://github.com/jVirus/ios-extensions/blob/master/extensions-kit/Extensions/Foundation/Int/Int%2BFactorial.swift) \nComputes *factorial* of `self`\n\n#### [Int+Power](https://github.com/jVirus/ios-extensions/blob/master/extensions-kit/Extensions/Foundation/Int/Int%2BPower.swift) \nOperator that performs `exponentiation` matematical operation, where left number is the *base* and the right one is the *exponent*\n\n#### [Int+Random](https://github.com/jVirus/ios-extensions/blob/master/extensions-kit/Extensions/Foundation/Int/Int%2BRandom.swift) \nGenerates pseudo-random number in a range that can be specified as `ClosedRange` or two separate `Int` properties\n\n#### [Int+Roman](https://github.com/jVirus/ios-extensions/blob/master/extensions-kit/Extensions/Foundation/Int/Int%2BRoman.swift) \nConverts `self` into *Roman* number (as `String`)\n\n#### [Int+DecimalToBinary](/extensions-kit/Extensions/Foundation/Int/Int%2BDecimalToBinary.swift) \nAllows to convert `decimal` number to `binary` format and vice versa \n\n### OptionSet\n#### [OptionSet+Operations](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/OptionSet/OptionSet%2BOperations.swift) \nAdds support for in-place `insert` and `remove` operations\n\n### MutableCollection \n[MutableCollection+Shuffle](https://github.com/jVirus/ios-extensions/blob/master/extensions-kit/Extensions/Foundation/MutableCollection/MutableCollection%2BShuffle.swift) \nIn-place shuffling of `self`\n\n### Sequence  \n#### [Sequence+Shuffle](/extensions-kit/Extensions/Foundation/Sequence/Sequence%2BShuffle.swift) \nShuffles the elements of `self`\n\n#### [Sequence+Count](/extensions-kit/Extensions/Foundation/Sequence/Sequence%2BCount.swift) \nCounts the number of occurrences of a logical expression\n\n#### [Sequence+DuplicatesRemoved](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Sequence/Sequence%2BDuplicatesRemoved.swift) \nRemoves the duplicate elements and returns the new Sequence without duplicates if any\n\n### String\n#### [String+Subscript](/extensions-kit/Extensions/Foundation/String/String%2BSubscript.swift) \nAdds conformances to `CoutableClosedRange`, `CountableRange`, `PartialRangeThrough` and `PartialRangeFrom` protocols support in a form of subscripts\n\n#### [String+Digits](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/String/String%2BDigits.swift) \nCombines decimal digits into a single `String` property\n\n#### [String+FormattedDate](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/String/String%2BFormattedDate.swift) \nCreates a `Date` instance from `self` based in the specified format\n\n#### [String+IndexOf](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/String/String%2BIndexOf.swift) \nFinds the first occurence for a given `String`\n\n#### [String+Base64](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/String/String%2BBase64.swift) \nEncodes/decodes `self` to `Base64` encoding\n\n#### [String+Validation](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/String/String%2BValidation.swift) \nContains a number of extensions for validating `String` based on the following: `isAlphanumeric`, `hasLetters`, `hasNumbers`, `isEmail`, `isAlphabetic`\n\n### NSObject\n#### [NSObject+ClassName](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/NSObject/NSObject%2BClassName.swift)\nAllows to get the exact class name:\n\n```swift\nlet className = Foo.nameOfclass\n// className property holds `Foo`\n```\n\n### NotificationCenter\n#### [NotificationCenter+PostUtils](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/NotificationCenter/NotificationCenter%2BPostUtils.swift)\nVarious utility extensions that help to reduce the boilerplate code:\n\n```swift\nNotificationCenter.post(notification: .userHasUpdated)\n```\n\n### OperationQueue\n#### [OperationQueue+MainUtils](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/Operaton/OperationQueue%2BMainUtils.swift)\nUtility extensions for `.main` operation queue:\n\n```swift\nOperationQueue.isMain // if current operation queue is the main the result will be true, otherwise false\nOperationQueue.onMain {\n        // This closure will be executed on the main operation queue\n}\n```\n\n### URL\n#### [URL+QRImage](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/Foundation/URL/URL%2BQRImage.swift)\nCreates a QR image from the `absoluteString` of the `URL`:\n\n```swift\nlet customUrlQRImage = url.qrImage()\n// customUrlQRImage holds image data for QR image that represents the given URL address\n```\n\n## UIKit\n\n### Badge\n#### [Badge](/extensions-kit/Extensions/UIKit/Badge/Badge.swift) \nA custom type, wrapper badge app icon `API` that simplifies development\n\n### UIScreen\n#### [UIScreen+InterfaceOrientation](/extensions-kit/Extensions/UIKit/UIScreen/UIScreen%2BInterfaceOrientation.swift) \nInterace orientation for the current `UIScreen`\n\n### UIApplication\n#### [UIApplication+SafeAreas](/extensions-kit/Extensions/UIKit/UIApplication/UIApplication%2BSafeAreas.swift) \nContains extensions that allow to get numerical representations of `top` and `bottom` safe areas\n\n### NSLayoutConstraint\n#### [NSLayoutConstraint+Animation](/extensions-kit/Extensions/UIKit/NSLayoutConstraint/NSLayoutConstraint%2BAnimation.swift) \nAllows a constraint to be animated when `animated` flag is a set to `true` (default is `false`)\n\n#### [NSLayoutConstraint+Activation](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/UIKit/NSLayoutConstraint%2BActivation/NSLayoutConstraint%2BActivation.swift) \nAdds convenience methods for *setting* and *activating* layout priorities\n\n### UIView\n#### [UIView+CACorners](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/UIKit/UIView/UIView%2BCACorners.swift) \nConvenience extension for setting and getting round corners\n\n#### [UIView+BezierRoundedCorners](/extensions-kit/Extensions/UIKit/UIView/UIView%2BBezierRoundedCorners.swift) \nYet another extension for rounding corners\n\n#### [UIView+HuggingPriority](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/UIKit/UIView/UIView%2BHuggingPriority.swift) \nConvenience wrappers that simplify inerfaces for *setContentHuggingPriority* and *setContentCompressionResistancePriority* methods\n\n#### [UIView+Screenshot](/extensions-kit/Extensions/UIKit/UIView/UIView%2BScreenshot.swift) \nAllows to take a screenshot of self\n\n#### [UIView+Constraints](/extensions-kit/Extensions/UIKit/UIView/UIView%2BConstraints.swift) \nAdds convenience auto-layout methods that allow to `pin`, `add`, get `height` \u0026 `width` and to get all the constrains for a particular `UIView`\n\n#### [UIView+LayoutAnimation](/extensions-kit/Extensions/UIKit/UIView/UIView%2BLayoutAnimation.swift) \nAdds animation extensions that operate on layout constraints\n\n#### [UIView+Masking](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/UIKit/UIView/UIView%2BMasking.swift) \nMasks the view with the specified UIRectCorner array and corner radius:\n\n```swift\nlet view = UIView()\nview.mask(corners: .allCorners, with: 10)\n```\n\n### UIColor\n#### [UIColor+ColorComponents](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/UIKit/UIColor/UIColor%2BColorComponents.swift)\nAdds support for missing color components properties such as `rgba`, `hsba` and `grayscale`\n\n#### [UIColor+Blend](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/UIKit/UIColor/UIColor%2BBlend.swift)\nBlends two colors by mixing the `RGBA` components:\n\n```swift\nlet blendedColor = red.blend(with: blue, intensity: 0.5)\n```\n\n#### [UIColor+Brightness](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/UIKit/UIColor/UIColor%2BBrightness.swift)\nChanges the brightness of a color:\n\n```swift\nlet brighterRed = red.increaseBrightness(0.25)\n```\n\n### UICollectionView\n#### [UICollectionView+CustomCellRegistration](https://github.com/jVirus/ios-extensions/blob/master/extensions-kit/Extensions/UIKit/UICollectionView/UICollectionView%2BCustomCellRegistration.swift) \nRegisters custom `UICollectionViewCell` for a `UICollectionView` instance. `UICollectionViewCell` needs to be located in current Bundle\n\n#### [UICollectionView+ScrollingUtils](/extensions-kit/Extensions/UIKit/UICollectionView/UICollectionView%2BScrollingUtils.swift) \nAdds methods that allow to programmatically scroll to the `top`, `bottom` or to the specified `index path` of a table view\n\n#### [UICollectionView+Safety](/extensions-kit/Extensions/UIKit/UICollectionView/UICollectionView%2BSafety.swift) \nAdds validation utils \n\n#### [UICollectionView+Operations](/extensions-kit/Extensions/UIKit/UICollectionView/UICollectionView%2BOperations.swift) \nConvenience `reload`, `delete` and `insert` operations for collections of item indices\n\n### UITableView\n#### [UITableView+FooterHeaderUtils](/extensions-kit/Extensions/UIKit/UITableView/UITableView%2BFooterHeaderUtils.swift)  \nThe extension adds convenience helpers for working with `Footer` and `Header` views\n\n#### [UITableView+ScrollingUtils](/extensions-kit/Extensions/UIKit/UITableView/UITableView%2BScrollingUtils.swift)  \nAdds methods that allow to programmatically scroll to the `top`, `bottom` or to the specified `index path` of a table view\n\n#### [UITableView+Safety](/extensions-kit/Extensions/UIKit/UITableView/UITableView%2BSafety.swift) \nAdds validation utils \n\n### UIImage\n#### [UIImage+Downsample](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/UIKit/UIImage/UIImage%2BDownsample.swift)\nDownsamples the input image to the specified point size and scale factor. Can be used to present the thumbnails, supports caching:\n\n```swift\nlet downsampledImage = UIImage.downsample(imageAt: url, to: targetSize)\n// downsampledImage stores a `UIImage` instance that was cached and downsized to the `targetSize`\n```\n\n#### [UIImage+ImageFromUIView](https://github.com/jVirus/ios-extensions/blob/master/extensions-kit/Extensions/UIKit/UIImage/UIImage%2BImageFromUIView.swift) \nRenders `UIView` to `UIImage`\n\n#### [UIImage+LandscapeCameraOrientationFix](https://github.com/jVirus/ios-extensions/blob/master/extensions-kit/Extensions/UIKit/UIImage/UIImage%2BLandscapeCameraOrientationFix.swift) \nFixes image orientation for cases when the image was captured using `AVFoundation` in *landscape interface orientation*\n\n#### [UIImage+RawOrientation](https://github.com/jVirus/ios-extensions/blob/master/extensions-kit/Extensions/UIKit/UIImage/UIImage%2BRawOrientation.swift) \nRaw image orientation (from `UIImageOrientation` to `Int32`) \n\n#### [UIImage+Resize](https://github.com/jVirus/ios-extensions/blob/master/extensions-kit/Extensions/UIKit/UIImage/UIImage%2BResize.swift) \nClass-level extension that allows to resize input image based on expected image *width* or/and *height*\n\n#### [UIImage+SolidColor](https://github.com/jVirus/ios-extensions/blob/master/extensions-kit/Extensions/UIKit/UIImage/UIImage%2BSolidColor.swift) \nCreate a `UIImage` from the *color data* and *size*\n\n#### [UIImage+Inverted](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/UIKit/UIImage/UIImage%2BInverted.swift) \nAdds a property that returns an *inverted* copy of `self`\n\n### UIImageView\n- [UIImageView+DownloadFromURL](https://github.com/jVirus/ios-extensions/blob/master/extensions-kit/Extensions/UIKit/UIImageView/UIImageView%2BDownloadFromURL.swift) - adds a convenience method for downloading and parsing `UIImage` with the specified `URL`\n- [UIImageView+Masking](https://github.com/jVirus/ios-extensions/blob/master/extensions-kit/Extensions/UIKit/UIImageView/UIImageView%2BMasking.swift) - masks a given `UIImage` with the target image size\n\n### UIAlertController\n#### [UIAlertController+Presentation](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/UIKit/UIAlertController/UIAlertController%2BPresentation.swift) \nPresents a UIAlertController with the given title, message, tintColor and alert actions:\n\n```swift\nUIAlertController.present(with: \"Warning!\", and: \"The item will be deleted\", from: targetViewController) { () -\u003e [UIAlertAction] in\n        let deleteAction = UIAlertAction(title: \"Delete\",\n                                         style: .destructive,\n                                         handler: { (action) in\n                // Callback handling\n        })\n            \n        let cancelAction = UIAlertAction(title: \"Cancel\",\n                                         style: .cancel,\n                                         handler: { (action) in\n                // Callback handling\n        })\n            \n        return [deleteAction, cancelAction]\n}\n```\n\n### UIViewController\n\n#### [UIViewController+ContainerController](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/UIKit/UIViewController/UIViewController%2BContainerViewController.swift)\nLoads, adds and removes container view controllers as children\n\n#### [UIViewController+ChildViewControllers](/extensions-kit/Extensions/UIKit/UIViewController/UIViewController%2BChildViewControllers.swift) \nAddds convenience methods for `adding` and `removing` child view controllers\n\n#### [UIViewController+Storyboard](/extensions-kit/Extensions/UIKit/UIViewController/UIViewController%2BStoryboard.swift) \nInstantiates a `UIViewController` instance from a `Storyboard` using the `UIViewController's` name as a reference name of the `Storyboard` file. Used in cases when `Coordinator` or `Flow` design patterns need to be implemented\n\n```swift\n// Instantiation of a view controller by explicitly setting the storyboard and identifier\nlet loginViewController = UIViewController.instantiateController(from: mainStoryboard, identifier: \"LoginViewController\")\n\n// An another way to instantiate a UIViewController instnace: here the identifier will be the class name\nlet viewController = UIViewController.instantiateController(from: mainStoryboard)\n```\n\n### UIWindow\n#### [UIWindow+Instantiate](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/UIKit/UIWindow/UIWindow%2BInstantiate.swift)\nSyntactic sugar for much easier `UIWindow` instantiation:\n\n```swift\nwindow = UIWindow.create(with: coordinator.rootViewController, option: .keyAndVisible)\n```\n\n## os\n### OSLog\n#### [OSLog+LogLevels](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/os/OSLog/OSLog%2BLogLevels.swift)\nAdds a number of convenient log levels and a global function that simplifies logging:\n\n```swift\nos_log(\"Received .json data from the remove\", log: .network)\nos_log(\"Attempting to sync with the main UI thread\", log: .ui)\n```\n\n## SpriteKit\n#### [SKTimingFunction](https://github.com/jVirus/ios-extensions/blob/master/extensions-kit/Extensions/SpriteKit/SKTimingFunction.swift) \nAdds **36(!)** different timing functions \n\n### SKEmitterNode\n#### [SKEmitterNode+AdvanceSimulation](https://github.com/jVirus/ios-extensions/blob/master/extensions-kit/Extensions/SpriteKit/SKEmitterNode/SKEmitterNode%2BAdvanceSimulation.swift) \nSafely advance the particle simulation for a given `TimeInterval`\n\n### SKSpriteNode\n#### [SKSpriteNode+GIF](https://github.com/jVirus/ios-extensions/blob/master/extensions-kit/Extensions/SpriteKit/SKSpriteNode/SKSpriteNode%2BGIF.swift)  \nAdds support for uploading and playing `GIFs` from local files\n\n### SKScene\n#### [SKScene+SerialSpriteLoading](https://github.com/jVirus/ios-extensions/blob/master/extensions-kit/Extensions/SpriteKit/SKScene/SKScene%2BSerialSpriteLoading.swift)\nUploads a set of scene graph nodes with a specific pattern, useful when a scene contains a lot of nodes, but just a specific subset needs to be processed or accessed\n\n#### [SKScene+ReferenceNodeFix](/extensions-kit/Extensions/SpriteKit/SKScene/SKScene%2BReferenceNodeFix.swift) \nA small fix that resolves the default behavior for nodes that were referenced from differnet .sks files. The thing is that they do not launch their animations by default, so this small `hack` fixes this issue\n\n### SKTexture\n#### [SKTexture+LinearGradient](https://github.com/jVirus/ios-extensions/blob/master/extensions-kit/Extensions/SpriteKit/SKTexture/SKTexture%2BLinearGradient.swift) \nAdds a convenience initializer that generates a `gradient texture` for the specified *size*, *start* and *end* colors\n\n### SKTextureAtlas\n#### [SKTextureAtlas+FramesLoader](https://github.com/jVirus/ios-extensions/blob/master/extensions-kit/Extensions/SpriteKit/SKTextureAtlas/SKTextureAtlas%2BFramesLoader.swift) \nUploads an animation sequence from a texture atlas and returns an array of textures that can be futher used\n\n## SceneKit\n\n#### [SCNVector3+Operators](/extensions-kit/Extensions/SceneKit/SCNVector3%2BOperators.swift) \nAdds support for various mathematical operators for `SCNVector3` type\n\n#### [SCNAction+MoveAlong](https://github.com/jVirus/extensions-kit/blob/master/extensions-kit/Extensions/SceneKit/SCNAction%2BMoveAlong.swift)\nThe extension adds a new action method that allows a node to move along a `UIBezierPath`:\n\n```swift\nlet flyoverAction = SCNAction.moveAlong(path: flyoverPath, z: 10, speed: plane.speed)\nplane.run(flyoverAction)\n```\n\n## PhotoKit\n\n### PHAsset\n#### [PHAsset+URL](/extensions-kit/Extensions/PhotoKit/PHAsset/PHAsset%2BURL.swift) \nProvides possibility to get `URL` for image and video media types\n--\u003e\n\n# 🙋‍♀️🙋‍♂️Contributing \n- There is just one main rule for contributors - **please include your extensions in separete files**. It's important since such extension can be more easily referenced and reused.\n- The other `soft` rule is - please include `unit tests` with your extensions. \n\n# 👨‍💻 Author \n[Astemir Eleev](https://github.com/jVirus)\n\n# 🔖 Licence\nThe project is available under [MIT licence](https://github.com/jVirus/extensions-kit/blob/master/LICENSE)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feleev%2Fextensions-kit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feleev%2Fextensions-kit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feleev%2Fextensions-kit/lists"}