[swift-evolution] Extending Failable Initializers

Brent Royal-Gordon brent at architechies.com
Fri Dec 4 19:29:31 CST 2015

> Its possible to extend the functionality of failable initializers beyond what they are capable of by making the parameters failable too. For instance:
> 	var someString : String? = “1” // Assume for some reason this is optional
> 	// Here the Int’s failable initializer allows for an optional Int even
> 	// though it was only actually written for a non optional type because 
> 	// the failable initializer fails when you give it a nil value.
> 	guard let someInt = Int(someString) 
> 	else { return }

You can get this kind of behavior with higher-order programming:

	var someString: String? = “1”
	guard let someInt = someString.flatMap(Int.init) else { return }

This says “if someString is nil, return nil; otherwise, initialize an Int passing the unwrapped value, and return the result”.

In general, Optional.map and Optional.flatMap let you do optional-chaining-like things in a much more general way. They’re pretty neat!

Brent Royal-Gordon

More information about the swift-evolution mailing list