Swift µframework of the ubiquitous Box<T> & MutableBox<T> reference types, for recursive value types & misc. other purposes.
Swift C
Latest commit 671a67e Sep 30, 2016 @robrix committed on GitHub Merge pull request #34 from alexfish/master
Convert to swift3
Failed to load latest commit information.
Box.xcodeproj Convert to swift3 Sep 5, 2016
Box Convert to swift3 Sep 5, 2016
BoxTests Convert to swift3 Sep 5, 2016
.gitignore Ignore some things. Oct 10, 2014
LICENSE MIT license. Oct 10, 2014
README.md Remove the type parameter from BinaryTree. Dec 21, 2014



This is a Swift microframework which implements Box<T> & MutableBox<T>, with implementations of ==/!= where T: Equatable.

Box is typically used to work around limitations of value types:

  • recursive structs/enums
  • type-parameterized enums where more than one case has a value


Wrapping & unwrapping a Box:

// Wrap:
let box = Box(1)

// Unwrap:
let value = box.value

Changing the value of a MutableBox:

// Mutation:
let mutableBox = MutableBox(1)
mutableBox.value = 2

Building a recursive value type:

struct BinaryTree {
    let value: Int
    let left: Box<BinaryTree>?
    let right: Box<BinaryTree>?

Building a parameterized enum:

enum Result<T> {
    case Success(Box<T>)
    case Failure(NSError)

See the sources for more details.


  1. Add this repo as a submodule in e.g. External/Box:

    git submodule add https://github.com/robrix/Box.git External/Box
  2. Drag Box.xcodeproj into your .xcworkspace/.xcodeproj.
  3. Add Box.framework to your target’s Link Binary With Libraries build phase.
  4. You may also want to add a Copy Files phase which copies Box.framework (and any other framework dependencies you need) into your bundle’s Frameworks directory. If your target is a framework, you may instead want the client app to include Box.framework.