Swift Tip: Non-Empty Collections
Last week, we wrote about an extension on Optional that we used to deal with either a nil value or an empty string:
							
								extension Optional where Wrapped: Collection {
    var nonEmpty: Wrapped? {
        return self?.isEmpty == true ? nil : self
    }
}
							
							This extension allowed us to handle both the nil and the empty case in one go:
							
								var vatNumber: String?
vatNumber.nonEmpty.map { "Your VAT Number is: \($0)" } ?? "No VAT Number."
							
							Pyry Jahkola sent us a good suggestion on Twitter: instead of adding a nonEmpty property on Optional, why not extend Collection with an optional nonEmpty property? This extension is both simpler and more versatile:
							
								extension Collection {
    var nonEmpty: Self? {
        return isEmpty ? nil : self
    }
}
							
							Using this extension together with optional chaining we can write our previous example like this:
								vatNumber?.nonEmpty.map { "Your VAT Number is: \($0)" } ?? "No VAT Number."
							
							Now we can use the same extension on non-optional collection types to substitute a default value, using the nil coalescing operator instead of a ternary operator:
							
								var vatNumber: String = "123"
vatNumber.nonEmpty.map { "Your VAT Number is: \($0)" } ?? "No VAT Number."
							
							Admittedly, the differences between these variants are slight. However, we always like to discover new ways of solving a given problem. ๐
To support our work, you can subscribe, or give someone a gift.