Skip to content

Instantly share code, notes, and snippets.

@koingdev
Created April 12, 2019 16:57
Show Gist options
  • Save koingdev/5d6c80b4b46a3c45be290b817eeea3a1 to your computer and use it in GitHub Desktop.
Save koingdev/5d6c80b4b46a3c45be290b817eeea3a1 to your computer and use it in GitHub Desktop.
Swift way to create an autoweak closure (No more retain cycle/memory leak)
// From this
didFinishLoading = { [weak self] in
guard let self = self else { return }
self.tableView.reloadData()
}
// To this
didFinishLoading = weaker(self) { s in
// No more boilerplate code :)
s.tableView.reloadData()
}
/// Create an autoweak closure (No param)
///
/// - Parameters:
/// - object: Any object we want to break the retain cycle (Autoweak)
/// - closure: New callback to execute
func weaker<Object: AnyObject>(_ object: Object?, closure: @escaping (Object) -> Void) -> () -> Void {
return { [weak object] in
guard let safeObject = object else { return }
closure(safeObject)
}
}
/// Create an autoweak closure (1 param)
///
/// - Parameters:
/// - object: Any object we want to break the retain cycle (Autoweak)
/// - closure: New callback to execute
func weaker<Object: AnyObject, Param1>(_ object: Object?, closure: @escaping (Object, Param1) -> Void) -> (Param1) -> Void {
return { [weak object] param1 in
guard let safeObject = object else { return }
closure(safeObject, param1)
}
}
/// Create an autoweak closure (2 params)
///
/// - Parameters:
/// - object: Any object we want to break the retain cycle (Autoweak)
/// - closure: New callback to execute
func weaker<Object: AnyObject, Param1, Param2>(_ object: Object?, closure: @escaping (Object, Param1, Param2) -> Void) -> (Param1, Param2) -> Void {
return { [weak object] param1, param2 in
guard let safeObject = object else { return }
closure(safeObject, param1, param2)
}
}
/// Create an autoweak closure (3 params)
///
/// - Parameters:
/// - object: Any object we want to break the retain cycle (Autoweak)
/// - closure: New callback to execute
func weaker<Object: AnyObject, Param1, Param2, Param3>(_ object: Object?, closure: @escaping (Object, Param1, Param2, Param3) -> Void) -> (Param1, Param2, Param3) -> Void {
return { [weak object] param1, param2, param3 in
guard let safeObject = object else { return }
closure(safeObject, param1, param2, param3)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment