在Swift中为多维数组添加数组扩展?

4

我有一个矩阵,即数组的数组。我想添加一些方法来更好地处理它,作为Array的扩展。我在考虑编写类似于以下内容的代码:

extension Array where Element == Array {
    // my methods
}

但是,这段代码无法编译,因为我添加了递归定义。显然,我可以省略where Element == Array部分,但这样看起来更好,只有在适当的情况下显示这些方法。是否有其他方法可以实现这一点?

编辑: 根据@Leo Dabus的建议,我将提供一些用例:

我有一个应用程序,其中有多个表视图控制器。在它们每个人中,我都有部分和行。为了填充它们,我使用两个数组:一个用于部分名称,另一个是对象(或结构)数组的数组 ->对应的部分和行位于索引路径中。因此,我想编写操作数组的方法,这些方法基于索引路径进行操作。例如:

a[indexPath] = sender

这些对象各不相同,有些是简单的字符串,有些则更加复杂。

4个回答

4

试试这个:

extension Array where Element: Collection {
}

4
这扩展了字典、集合、字符串等数组,而不仅仅是数组的数组。 - ielyamani

1
要扩展一个类型为YourType的对象数组的数组,使用以下代码:
extension Array where Element == Array<YourType> { 
    //Your methods
}

请注意,这将不允许您对数组的切片使用您的方法。 - Leo Dabus

0
你可以尝试这个:
// extension primarily for array of arrays
extension Collection where Element: Collection {
    /// all elements (rows) are of the some length
    /// - `[[1,2], [3,4]].allElementsSameLength == true`
    public var allElementsSameLength: Bool {
        guard !isEmpty else { return true }
        return dropFirst().allSatisfy { $0.count == first!.count }
    }
}

运行示例数据:

// array of arrays
let data = [
    ["labe", "value", "type"],
    ["name", "joe", "String"],
    ["age", "8", "Int"]
]

let data2 = [
    ["labe", "value", "type"],
    ["name", "joe"],
    ["age", "8", "Int"]
]

let data3 = [[1,1], [3,4]]
let data4 = [[1,2,3]]            // one row only
let data5 = [[Int]]()            // no row

结果是:

data.allElementsSameLength,     // T
data2.allElementsSameLength,    // F
data3.allElementsSameLength,    // T
data4.allElementsSameLength,    // T
data5.allElementsSameLength,    // T

0
解决方案是在函数上使用上下文Where子句,而不是在扩展上使用where。在函数上下文中,您可以引入通用参数。
以下是一个计算2D矩阵迹的示例:
public extension Array {
    func trace<T: BinaryFloatingPoint>() -> T where Element == Array<T> {
        var total: T = 0
        
        for i in 0...count {
            let row = self[i]
            total += row[i]
        }
        
        return total
    }
}

然而,如果你计划实现2D数组,我强烈建议你考虑使用一个大小为cols * rows的单一数组,然后适当地进行索引。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接