DEV Community

Cover image for Array of weak in Swift.
Sergey Leschev
Sergey Leschev

Posted on • Edited on

Array of weak in Swift.

In Swift, when working with objects, it's important to manage memory correctly. One way to do this is by using weak references to avoid retaining objects too long and causing memory leaks. In this article, we will discuss how to create an array of weak references in Swift using a generic wrapper.


What are weak references?
Before diving into weak references in arrays, let's quickly explain what they are. In Swift, a weak reference is a type of pointer that doesn't hold a strong reference to the object it points to. This means that the object can be deallocated by the system if there are no other strong references to it. Weak references are ideal for situations where you don't want to retain an object for the lifetime of the program, but only need a reference to it temporarily.

Creating a generic wrapper
To create an array of weak references, we can use a generic wrapper. This wrapper will hold the weak reference to the object and can be used to add instances to the array.

Here's an example of how to create a generic wrapper:

class Weak<T: AnyObject> {
  weak var value : T?
  init (value: T) {
    self.value = value
  }
}
Enter fullscreen mode Exit fullscreen mode

In this code, we define a class called Weak. The T in represents the type of object that we want to store a weak reference to. Inside the class, we define a weak variable called value of type T?. This variable will hold the weak reference to the object. We also define an initializer that takes a value of type T and assigns it to value.

Adding instances to the array
Now that we've created our generic wrapper, we can add instances of this class to our array.

Here's an example of how to add instances of the Weak class to an array:

class Stuff {}
var weaky: [Weak<Stuff>] = 
  [Weak(value: Stuff()), Weak(value: Stuff())]
Enter fullscreen mode Exit fullscreen mode

In this code, we define a class called Stuff. We also define an array called weaky of type [Weak]. This means that we're creating an array of weak references to instances of the Stuff class. We create two instances of the Weak class and pass in instances of the Stuff class as values.

Reaping array contents
To help with reaping array contents, we can add a method to the Weak class that checks if the reference is still valid. Here's an example of how to do this:

class Weak<T: AnyObject> {
  weak var value: T?
  init(value: T) {
    self.value = value
  }

  func isValid() -> Bool {
    return value != nil
  }
}
Enter fullscreen mode Exit fullscreen mode

In this code, we've added a method called isValid() to the Weak class. This method checks if the weak reference stored in value is still valid. If it is, then the method returns true. Otherwise, it returns false.

When defining Weak you can use either struct or class. Also, to help with reaping array contents, you could do something along the lines of:

extension Array where Element : Weak<AnyObject> {
  mutating func reap () {
    self = self.filter { nil != $0.value }
  }
}
Enter fullscreen mode Exit fullscreen mode

The use of AnyObject above should be replaced with T - but I don't think the current Swift language allows an extension defined as such.

Conclusion
In this article, we've discussed how to create an array of weak references in Swift using a generic wrapper. By using weak references, we can avoid retaining objects for too long and causing memory leaks. We've also shown how to add instances to the array and how to reap the contents of the array.


Contacts
I have a clear focus on time-to-market and don't prioritize technical debt. And I took part in the Pre-Sale/RFX activity as a System Architect, assessment efforts for Mobile (iOS-Swift, Android-Kotlin), Frontend (React-TypeScript) and Backend (NodeJS-.NET-PHP-Kafka-SQL-NoSQL). And I also formed the work of Pre-Sale as a CTO from Opportunity to Proposal via knowledge transfer to Successful Delivery.

🛩️ #startups #management #cto #swift #typescript #database
📧 Email: sergey.leschev@gmail.com
👋 LinkedIn: https://linkedin.com/in/sergeyleschev/
👋 LeetCode: https://leetcode.com/sergeyleschev/
👋 Twitter: https://twitter.com/sergeyleschev
👋 Github: https://github.com/sergeyleschev
🌎 Website: https://sergeyleschev.github.io
🌎 Reddit: https://reddit.com/user/sergeyleschev
🌎 Quora: https://quora.com/sergey-leschev
🌎 Medium: https://medium.com/@sergeyleschev
🖨️ PDF Design Patterns: Download

Top comments (0)