Следующий код является результатом, который я сделал из перечисленных выше взносов:
protocol DeepCountable {
var deepCount: Int { get }
}
// now any Array is DeepCountable
extension Array: DeepCountable {
var deepCount: Int {
return compactMap{ $0 as? DeepCountable }.reduce(0){ $0 + $1.deepCount }
}
}
extension Int: DeepCountable {
var deepCount: Int { return 1 }
}
// test
let a = [[1,2,3],[4,5],[6,7,8,9]]
let b = [1, 2, 3,[4,5,6],[[7,8],[9,0]]] as [Any]
let c = [1,2,"a","b"] as [Any]
let d = [1,2,3,[4,5],[6,7,8,[9, 0]]] as [Any]
print( a.deepCount ) // 9
print( b.deepCount ) // 10
print( c.deepCount ) // 2
print( d.deepCount ) // 10
Этот код должен работать со Swift 5, я пробовал его на Online Swfit Playground , и он отлично работает.