Search code examples
swiftextension-methods

Swift extension example


I was originally wanting to know how to make something like this

UIColor.myCustomGreen

so that I could define my own colors and use them throughout my app.

I had studied extensions before and I thought that I could probably use them to solve my problem, but I couldn't remember exactly how to set extensions up. Searching on Google at the time of this writing for "Swift extension" resulted in the documentation, several long tutorials, and a rather unhelpful Stack Overflow question.

So the answers are out there, but it takes some digging through the docs and tutorials. I decided to write this question and the following answer to add some better search keywords to Stack Overflow and to provide a quick refresher on how extensions are set up.

Specifically I wanted to know:

  • Where do the extensions reside (file and naming convention)?
  • What is the extension syntax?
  • What are a few simple common use examples?

Solution

  • Creating an extension

    Add a new swift file with File > New > File... > iOS > Source > Swift File. You can call it what you want.

    The general naming convention is to call it TypeName+NewFunctionality.swift.

    enter image description here

    Example 1 - Double

    Double+Conversions.swift

    import Swift // or Foundation
    
    extension Double {
    
        func celsiusToFahrenheit() -> Double {
            return self * 9 / 5 + 32
        }
    
        func fahrenheitToCelsius() -> Double {
            return (self - 32) * 5 / 9
        }
    }
    

    Usage:

    let boilingPointCelsius = 100.0
    let boilingPointFarenheit = boilingPointCelsius.celsiusToFahrenheit()
    print(boilingPointFarenheit) // 212.0
    

    Example 2 - String

    String+Shortcuts.swift

    import Swift // or Foundation
    
    extension String {
    
        func replace(target: String, withString: String) -> String {
            return self.replacingOccurrences(of: target, with: withString)
        }
    }
    

    Usage:

    let newString = "the old bike".replace(target: "old", withString: "new")
    print(newString) // "the new bike"
    

    Here are some more common String extensions.

    Example 3 - UIColor

    UIColor+CustomColor.swift

    import UIKit
    
    extension UIColor {
    
        class var customGreen: UIColor {
            let darkGreen = 0x008110
            return UIColor.rgb(fromHex: darkGreen)
        }
    
        class func rgb(fromHex: Int) -> UIColor {
    
            let red =   CGFloat((fromHex & 0xFF0000) >> 16) / 0xFF
            let green = CGFloat((fromHex & 0x00FF00) >> 8) / 0xFF
            let blue =  CGFloat(fromHex & 0x0000FF) / 0xFF
            let alpha = CGFloat(1.0)
    
            return UIColor(red: red, green: green, blue: blue, alpha: alpha)
        }
    }
    

    See here also.

    Usage:

    view.backgroundColor = UIColor.customGreen
    

    enter image description here

    Notes

    • Once you define an extension it can be used anywhere in your app just like the built in class functions.
    • If you are not sure of exactly what the function or property syntax should look like, you can Option+click a similar built in method. For example, when I Option+clicked UIColor.greenColor I see the declaration is class func greenColor() -> UIColor. That gives me a good clue for how to set up my custom method.
    • Apple Documentation for Extensions
    • In Objective-C extensions are known as categories.