Here's a (little ugly) way which works if you use reduce(into:, _:):
let list = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]
let x = list.reduce(into: [[]]) { (r, i) in
if r.isEmpty || r.last!.count == 3 { r.append([i]) }
else { r[r.count-1].append(i) }
}
print(x) // [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15], [16, 17, 18], [19, 20, 21]]
But if you want a 2d array for eg a pixel image, you'd probably want to write your own type for that (allocating its own storage etc, for performance reasons). Conforming such a type to eg Collection wouldn't make much sense though (1-dimensional indices for a 2-dimensional collection, etc).