nyan nyan nyan nyan nyan nyan - 2 months ago 36
Swift Question

Extending typed Arrays (of primitive types like Bool) in Swift 3?

Previously in Swift 2.2 I'm able to do:

extension _ArrayType where Generator.Element == Bool{
var allTrue : Bool{
return !self.contains(false)
}
}


which extends
[Bool]
with
.allTrue
. E.g.

[true, true, false].allTrue == false


But in Swift 3.0 I'm getting this error:


undeclared type
_ArrayType






So I tried switching it to
Array
and using the new keyword
Iterator


extension Array where Iterator.Element == Bool
var allTrue : Bool{
return !self.contains(false)
}
}


But I got a different error complaining that I'm forcing element to be non-generic


Same-type requirement makes generic parameter 'Element' non-generic





I've also tried the solutions in this 2 years old post but to no avail.

So how does one extend arrays of primitive types like Bool in Swift 3?

Answer

Just extend the Collection or the Sequence

extension Collection where Iterator.Element == Bool { 
    var allTrue: Bool { return !contains(false) }
}

Testing Playground:

[true, true,true, true,true, true].allTrue // true
[true, true,false, true,true, true].allTrue // false

Another option is to create a custom protocol and extend it:

protocol BoolConvertible {
    var bool: Bool { get }
}
extension Bool: BoolConvertible {
    var bool: Bool { return self }
}

extension Array where Element: BoolConvertible {
    var allTrue: Bool { return !contains{!$0.bool} }
}