BellAppLab/Weakable
An easy way to hold weak references in Swift.
Requirements
- iOS 12+
- watchOS 4+
- tvOS 12+
- macOS 11+
- Swift 4+
Usage
Declare your Weak variable in one of the two ways provided:
//Given a class
class TestClass {}
//and an instance of that class
var aTestObject = TestClass()
//You can create a Weak like this:
var weakTestObject = Weak(aTestObject)
//Or using the shorthand operator ≈
var anotherWeakTestObject = ≈testAccess your variable:
weakTestObject.object //returns your value as an optional, since it may or may not have been releasedOperators
Weakable comes with 3 operators, all using the ≈ character (⌥ + x).
prefix ≈
* Shorthand contructor for a Weak variable:
//Given an object
let object = AwesomeClass()
//you can create a Weak by either
var weakObject = Weak(object)
//or
var weakObject = ≈objectpostfix operator ≈
* Shorthand accessor for Weak:
//Given a Weak
var weakObject = ≈object
//you can access the underlying object by
weakObject.object
//or
weakObject≈infix operator ≈
* Shorthand assignment for Weak:
//Given a Weak
var weakObject = ≈object
//you can change the underlying object by
weakObject.object = anotherObject
//or
weakObject ≈ anotherObjectArrays and Dictionaries
You can safely store your Weak variables in collections (eg. [Weak<TestClass>]). The underlaying objects won't be retained.
var tests = (1...10).map { TestClass() } // 10 elements
var weakTests = ≈tests // 10 elements
tests.removeLast() // `tests` now have 9 elements, but `weakTests` have 10
weakTests = weakTests.filterWeaks() // `weakTests` now have 9 elements too, since we dropped the released objects from itYou can also quickly "unwrap" the elements in a Weak collection:
let tests = weakTests.compactWeaks()The variable tests will now be a [TestClass] containing only the elements that haven't been released yet.
Global weaks
Version 2.0 introduces the concept of global weak variables. Say you want to share the same instance of a class in several places, but you want to release the global variable once all other references are destroyed. That's what a global weak is.
final class TestClass: WeaklyGloballyIdentifiable {
typealias GlobalID = Int
@WeakGlobalActor
static var weakGlobals: [GlobalID: Weak<TestClass>] = [:]
}
let firstInstance = TestClass.weakGlobal(id: 1, default: TestClass())
let secondInstance = TestClass.weakGlobal(id: 1, default: TestClass())
print(firstInstance === secondInstance) // `true`Installation
Swift Package Manager
dependencies: [
.package(url: "https://github.com/BellAppLab/Weakable", from: "2.0")
]Then import Weakable where needed.
Legacy
The following import methods only work for version 1.0.1.
Cocoapods
pod 'Weakable', '~> 1.0'Then import Weakable where needed.
Carthage
github "BellAppLab/Weakable" ~> 1.0Then import Weakable where needed.
Git Submodules
cd toYourProjectsFolder
git submodule add -b submodule --name Weakable https://github.com/BellAppLab/Weakable.gitThen drag the Weakable folder into your Xcode project.
License
Weakable is available under the MIT license. See the LICENSE file for more info.
Package Metadata
Repository: BellAppLab/Weakable
Stars: 1
Forks: 0
Open issues: 0
Default branch: master
Primary language: swift
License: MIT
Topics: carthage, cocoapods, ios, linux, macos, osx, swift, swift-package-manager, tvos, watchos, weak
README: README.md