A closure assigned to a variable is already a named handler… Make it optional and it’s now a cancelable named handler… Put it in a defer block and you have exactly what you want, a cancelable named defer handler…
func doSomething(input: String) -> String? { // Create a cancelable named defer handler var namedDeferHandler: (() -> Void)? = { print("It didn't work, but I've taken care of any cleaning up.") } defer { namedDeferHandler?() } // Check the input if input == "" { return nil } // Cancel the named defer handler namedDeferHandler = nil return "It worked!" } It’s very flexible, you can have multiple handlers and cancel only some of them, include some non-optional code in the defer block itself, etc. On Sat, 7 Jan 2017 at 18:45 Charles Srstka via swift-evolution < swift-evolution@swift.org> wrote: > > On Jan 7, 2017, at 12:40 PM, D. Felipe Torres via swift-evolution < > swift-evolution@swift.org> wrote: > > > > Any cancelable defer addition we could come up with will need a > flag/state to indicate so, which won't be that much different from what you > wrote. > > > > Having said that, for your example may I suggest this approach instead: > > > > func openFile(kind: String) -> UnsafeMutablePointer<FILE>? { > > > > var file = fopen("MyFile.txt", "r") > > guard fileIsValid(file) > > && fileContainsData(file, kind) > > && !fileDataOutOfDate(file) else { > > fclose(file) > > } > > > > return file > > } > > Or: > > func openFile(kind: String) -> UnsafeMutablePointer<FILE>? { > var file = fopen("MyFile.txt", "r”) > > do { > if fileIsNotValid(file) { throw MyError.fileIsNotValid } > > if fileDoesNotContainsData(file, kind) { throw > MyError.doesNotContainData } > > if fileDataOutOfDate(file) { throw MyError.dataOutOfDate } > > return file > } catch { > fclose(file) > } > } > > Charles > _______________________________________________ > swift-evolution mailing list > swift-evolution@swift.org > https://lists.swift.org/mailman/listinfo/swift-evolution >
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution