Rethrows saves us a lot of duplicate code. Look at my naive approach to write an iterator in Swift 1 from last year which I later extended for throwing with Swift 2:

extension Array {

func each(@noescape iterator: (Element) -> Void) {

for element in self {
iterator(element)
}
}

func each(@noescape iterator: (Element) throws -> Void) throws {

for element in self {
try iterator(element)
}
}
}

This can be written as a single method with Swift 2 as I later found out:

extension Array {

func each(@noescape iterator: (Element) throws -> Void) rethrows {

for element in self {
try iterator(element)
}
}
}

The rethrows keyword makes the method a throwing one depending on the closure you pass in. Only if the closure throws each will throw, too. The compiler will know what happens — just like generic functions are write-once, use-many-times.

Of course I later found out that Swift 2 came with forEach already bundled in. So there’s no use in this anymore except for this very illustrative blog post to remember that throws/rethrows is different from throws/throws.

via Worklog of Christian Tietze http://ift.tt/1OuDK70

Show your support

Clapping shows how much you appreciated Christian Tietze’s story.