Skip to content

Instantly share code, notes, and snippets.

@swhitty
Created May 22, 2021 03:29
Show Gist options
  • Save swhitty/02a0d1ba9b72ec60c04353d72225ac13 to your computer and use it in GitHub Desktop.
Save swhitty/02a0d1ba9b72ec60c04353d72225ac13 to your computer and use it in GitHub Desktop.
// Closures cannot be weak, but we can wrap an object and its static factory method that returns an
// instance to create a pseudo weak closure
//
struct Method {
static func weak<T: AnyObject, A>(_ base: T, factory: @escaping (T) -> ((A) -> Void)) -> (A) -> Void {
{ [weak base] in base.map(factory)?($0) }
}
static func weak<T: AnyObject, A, B>(_ base: T, factory: @escaping (T) -> ((A, B) -> Void)) -> (A, B) -> Void {
{ [weak base] in base.map(factory)?($0, $1) }
}
static func weak<T: AnyObject, A, R>(_ base: T, factory: @escaping (T) -> ((A) -> R)) -> (A) -> R? {
{ [weak base] in base.map(factory)?($0) }
}
static func weak<T: AnyObject, A, B, R>(_ base: T, factory: @escaping (T) -> ((A, B) -> R)) -> (A, B) -> R? {
{ [weak base] in base.map(factory)?($0, $1) }
}
}
var text: NSString = "The quick brown fox jumps over the lazy dog"
// func capitalized(with locale: Locale?) -> String
let weakMethod = Method.weak(text, factory: NSString.capitalized)
print(weakMethod(NSLocale.current))
// Optional("The Quick Brown Fox Jumps Over The Lazy Dog")
text = "Hola"
print(weakMethod(NSLocale.current))
// nil
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment