Latest 1.0.0
License MIT
Platforms ios 9.0, tvos 9.0

Extra 👌🏼

CI Status

A Swift 4 library with usefull and lightfull extensions for your Cocoa Touch projects.


To run the example project, clone the repo, and run pod install from the Example directory first.


  • iOS 9+
  • Xcode 8+, Swift 4


Extra is available through CocoaPods. To install
it, simply add the following line to your Podfile:

pod "Extra"

# or via subspec :

pod "Extra/UIKit"
pod "Extra/Foundation"
pod "Extra/Realm"


UI Utils Third-party libraries
UIApplication String Realm
UICollectionView Collection
UITableView Sequence


Use the ex variable on your current type to access to the Extra methods :


UIKit extensions 🎨


  • UIActivityIndicator accessbility : hideActivityIndicator() / showActivityIndicator()


  • currentIndexPathForCenter() : return the index path of cell displayed at the center(x,y) of the UICollectionView
  • public func scrollVertically(to: IndexPath, accordingTo: IndexPath, animated: Bool = default) : scroll to an item an be sur to let the other be vivisble if possible
  • collectionView property : return the current UICollectionView related to the cell


  • toImage(size: CGSize = default) -> UIImage? : Transform the current color to a sizable UIImage
  • fromHexa(_ hexaString: String, alpha: CGFloat = default) -> UIColor? : Create a color from an hexa string


  • isPad / isPhone quick access


  • from(color: UIColor, size: CGSize, cornerRadius: CGFloat = default) -> UIImage? : Creates an UIImage from and UIColor This is usefull for your UIButton to set filled background color for states.
  • toBlackAndWhite() -> UIImage? : Transforms the current image to a new one with the CIColorMonochrome filter, with black input color.
  • imageRotatedByDegrees(degrees: CGFloat) -> UIImage? : Correctly rotate your image according to the desired degrees.
  • scaledFilledToSize(size: CGSize) -> UIImage? : This will resize the UIImage to the destination size This will fill your UIImage (and potentially enlarge it) By this way, this will not produce empty space on top/bottom or left/right sides, the ratio will not change.
  • resizableImageByCenter() -> UIImage : Simple reisze of your image based to it center.


  • popPreviousAndPushViewController(_ controller: UIViewController) : The effect is like a replacement of the current stack, but just the last one UIViewController.
  • popViewControllers(numberOf: Int, animated: Bool = default) : Pop the current stack of Navigation Controller by the specified number.



  • setAndLayoutTableHeaderView(_ headerView: UIView, edges: UIEdgeInsets? = default) : Configure and set the global table HeaderView and correctly set the frame to the fitting size
  • layoutTableHeaderView(_ headerView: UIView, edges: UIEdgeInsets? = default) : Automatic height for your header. Call it on didLayoutSubviews
  • setAndLayoutTableFooterView(_ footerView: UIView, edges: UIEdgeInsets? = default) : Configure and set the global table FooterView and correctly set the frame to the fitting size
  • layoutTableFooterView(_ footerView: UIView, edges: UIEdgeInsets? = default) : Automatic height for your footer. Call it on didLayoutSubviews


  • tableView property : return the current UICollectionView related to the cell


  • initXib() : Use this method in your custom UIView with a specified Xib, to add your xib content at creation
  • instantiateFromNib() -> UIView : Create and retrieve the root UIView of your Xib based on the current UIView class name
  • addSubview(_ subview: UIView, insets: UIEdgeInsets) : Add a subview into the current UIView with potential insets.
  • removeAllSubViews() : Recursively remove all your related subviews
  • setAllSubviewsHidden(_ hidden: Bool) : Recursively hide all your related subviews
  • addClearToDarkGradient(radius: CGFloat = default, direction: ExtraGradientDirection) : This will create a gradient into your current UIView (so this is available for UIImageView) Be sure to have a background color dark to have good results
  • roundCorners(_ corners: UIRectCorner, radius: CGSize) : Apply a rounded mask to the current view
  • addDashedBorder(color: CGColor, thickness: CGFloat) : Apply a dashed border to the current view
  • addShadowBorder(color: UIColor, size: CGFloat) : Apply a shadow to all edges except the top border.
  • addBottomDivider(color: UIColor, alpha: CGFloat, widthMultiplier: CGFloat) : Apply a bottom divider to the current view


  • topMost() -> UIViewController? : Returns the current application’s top most view controller.
  • addChildViewController(_ childController: UIViewController, in container: UIView, insets: UIEdgeInsets = default) : Simply programmatically adding a child view controller
  • switchChilds(from originController: UIViewController?, to destinationController: UIViewController, in viewContainer: UIView, duration: TimeInterval = default, transitionOptions: UIViewAnimationOptions = default, completion: ((Bool) -> Void)? = default) : Switch between child view controllers

Realm 💾


Simply detach an object from Realm into memmory with its entire properties.


For Object and Realm classes, use the ex property to access to the Extra extensions.

  • add(in inRealm: Realm? = default, update: @escaping Bool = default) throws : Simply write and add your update in Realm


  • safeInstance() -> Realm : Return your [try Realm] instance no-throwable at any time
  • safeInstance(config: Realm.Configuration) -> Realm : Return your [try Realm] instance no-throwable at any time froma specific configuration


  • subscript(safe index: Int) -> T? { get } : Safety getter object on your results
  • ex_toArray() -> [T] : Return results as a sequence Temporary name


  • ex_toArray() -> [T] : Return lsit of object as a sequence Temporary name

Foundation extensions


  • heightConstrained(to width: CGFloat, attributes: [String : Any]? = default) -> CGFloat : Same as boundingRect(), but simplified !
  • isValidEmail() -> Bool : [A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+.[A-Za-z]{2,6}
  • firstCapitalized() -> String : Capitalize only the first letter of the entire string (localized capitalized)
  • matchesRegex(regex: String) -> Bool : Check if the string matches to the passed regex
  • base64() -> String? : Base-64 encoded string


  • shuffle() : Shuffles the contents of this collection.


  • shuffled() -> [Iterator.Element] : Returns an array with the contents of this sequence, shuffled.


The iOS Team @Smart&Soft, software agency


Extra is available under the MIT license. See the LICENSE file for more info.

Latest podspec

    "name": "Extra",
    "version": "1.0.0",
    "summary": "Swift 4 library with usefull and lightfull extensions for your Cocoa Touch projects.",
    "homepage": "",
    "license": {
        "type": "MIT",
        "file": "LICENSE"
    "authors": {
        "Smart&Soft": "[email protected]"
    "source": {
        "git": "",
        "tag": "1.0.0"
    "platforms": {
        "ios": "9.0",
        "tvos": "9.0"
    "ios": {
        "frameworks": [
    "default_subspecs": [
    "pushed_with_swift_version": "4.0",
    "subspecs": [
            "name": "UIKit",
            "source_files": [
            "name": "Foundation",
            "source_files": [
            "name": "Realm",
            "source_files": [
            "dependencies": {
                "RealmSwift": [
                    "~> 3.0"

Pin It on Pinterest

Share This