Skip to content

When 'lazy var' doesn't cut it, have a truly Lazy variable in Swift.


Notifications You must be signed in to change notification settings


Folders and files

Last commit message
Last commit date

Latest commit



5 Commits

Repository files navigation

Laziable Version License

Platforms Swift support CocoaPods Compatible Carthage compatible Twitter


So you declared a lazy var in Swift thinking it would behave like lazily instantiated variables in good ol' Objective-C. You thought you would set them to nil and they would reconstruct themselves later on when needed.

You poor thing.

They don't.

So why not bring that awesomeness back to Swift in a very lightweight way?


  • iOS 9+
  • watchOS 3+
  • tvOS 9+
  • watchOS 3+
  • macOS 10.10+
  • Swift 4.2+


Declare your Lazy variable in one of the three ways provided:

Suggestion: for the best results, use let when declaring your Lazy variables.

class TestClass
    let lazyString = §{
        return "testString"

    let lazyDouble: Lazy<Double> = Lazy {
        return 0.0

    let lazyArray = Lazy {
        return ["one", "two", "three"]

Access your variable:

let testObject = TestClass()
print(testObject.lazyString§) //prints out "testString"

Set your variable to nil, so it gets reconstructed again later:

let testObject = TestClass()
testObject.lazyDouble §= nil


  • prefix §
    • Shorthand contructor for a Lazy variable:
let lazyThing = §{
    return <#code#>
  • postfix operator §
    • Shorthand accessor for Lazy:
let lazyString = §{
    return "Much cool"

print(lazyThing§) //prints out "Much cool"
  • infix operator §=
    • Shorthand assignment for Lazy:
let lazyString = §{
    return "Much cool"

lazyString §= nil //the string "Much cool" has been destroyed
print(lazyThing§) //reconstructs the string and prints out "Much cool"


For the best results, use let when declaring your Lazy variables.

Also, make sure to use [weak self] or [unowned self] if capturing self in a Lazy variable's constructor.



pod 'Laziable', '~> 1.1'

Then import Laziable where needed.


github "BellAppLab/Laziable" ~> 1.1

Then import Laziable where needed.

Swift Package Manager

dependencies: [
    .package(url: "", from: "1.1.0")

Then import Laziable where needed.

Git Submodules

cd toYourProjectsFolder
git submodule add -b submodule --name Laziable

Then drag the Laziable folder into your Xcode project.


Bell App Lab,


Logo image by Georgiana Ionescu from The Noun Project


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