Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 同一类型约束“Element”==“Array”是递归的_Arrays_Swift_Extension Methods - Fatal编程技术网

Arrays 同一类型约束“Element”==“Array”是递归的

Arrays 同一类型约束“Element”==“Array”是递归的,arrays,swift,extension-methods,Arrays,Swift,Extension Methods,我想为矩阵创建一个精巧的初始值设定项,让我用一个默认元素定义行和列计数。如何为数组数组创建扩展?当我尝试下面的方法时 extension Array where Element == Array<SubElement> { init(rows: Int, columns: Int, emptyDefault: SubElement) { self = [] // implementation } } 我希望能够做这样的事情。这

我想为矩阵创建一个精巧的初始值设定项,让我用一个默认元素定义行和列计数。如何为数组数组创建扩展?当我尝试下面的方法时

extension Array where Element == Array<SubElement> {

    init(rows: Int, columns: Int, emptyDefault: SubElement) {

        self = [] 
        // implementation
    }

}

我希望能够做这样的事情。

这并不完美,我的临时工作如下:

extension Collection where Element: Collection {

}

这并不完美,我的临时工作是:

extension Collection where Element: Collection {

}

如果需要创建元素矩阵,可以扩展RangeReplaceableCollection并将其元素约束到RangeReplaceableCollection。您需要将element.element类型的默认元素添加到初始值设定项以填充集合:

extension RangeReplaceableCollection where Element: RangeReplaceableCollection { 
    init(rows: Int, columns: Int, element: Element.Element) { 
        self.init(repeating: .init(repeating: element, count: columns), count: rows) 
    }
}
用法:

let matrix: [[UIColor]] = .init(rows: 3, columns: 3, element: .blue)

如果需要创建元素矩阵,可以扩展RangeReplaceableCollection并将其元素约束到RangeReplaceableCollection。您需要将element.element类型的默认元素添加到初始值设定项以填充集合:

extension RangeReplaceableCollection where Element: RangeReplaceableCollection { 
    init(rows: Int, columns: Int, element: Element.Element) { 
        self.init(repeating: .init(repeating: element, count: columns), count: rows) 
    }
}
用法:

let matrix: [[UIColor]] = .init(rows: 3, columns: 3, element: .blue)


利奥的回答很好 利奥的回答很好。好电话。奇怪的是,Swift允许递归一致性,但不允许递归相等。@LeoDabus,已更新。我想向数组的泛型数组中添加方法,它可以在每个单元格中使用泛型元素。这很简单,我只想在定义行数和列数的同时用空单元格初始化矩阵。我可以补充一点。。我不知道如何使它更具体。[[/*行1*/单元格1,单元格2],/*行2*/单元格3,单元格4],/*行3*/单元格5,单元格6]]哇。非常聪明。非常感谢。如果你想把它作为一个答案,那正是我要找的。打得好。奇怪的是,Swift允许递归一致性,但不允许递归相等。@LeoDabus,已更新。我想向数组的泛型数组中添加方法,它可以在每个单元格中使用泛型元素。这很简单,我只想在定义行数和列数的同时用空单元格初始化矩阵。我可以补充一点。。我不知道如何使它更具体。[[/*行1*/单元格1,单元格2],/*行2*/单元格3,单元格4],/*行3*/单元格5,单元格6]]哇。非常聪明。非常感谢。如果你想把它作为一个答案,那正是我想要的。哦,聪明。我喜欢。我也喜欢,直到你把那句台词写得太长!where子句通常使行太宽,所以我将where与关键字排成一行,该关键字开始于收缩的内容。此外,我故意省略了结束括号。像这样,它不会编译!我很抱歉!我刚看到这个。你把它换回来了吗?哦,真聪明。我喜欢。我也喜欢,直到你把那句台词写得太长!where子句通常使行太宽,所以我将where与关键字排成一行,该关键字开始于收缩的内容。此外,我故意省略了结束括号。像这样,它不会编译!我很抱歉!我刚看到这个。你把它改回来了吗?你能把这个空的init实现也包括在答案中吗?我很难过看到它被删除了。你可以把init作为元素传递。另一种方法是使类型符合协议,正如我说的,只需将init作为元素传递给let矩阵:[[String]=.initrows:3,columns:3,element:.initprotocol HasInit{init}扩展字符串:HasInit{}扩展rangereplacablecollection,其中元素:rangereplacablecollection,Element.Element:HasInit{initrows:Int,columns:Int{self.initrepeating:.initrepeating:Element.Element,count:columns,count:rows}IMO传递init是首选的。您能在回答中也包含空的init实现吗?我很难过看到它被删除了。你可以把init作为元素传递。另一种方法是使类型符合协议,正如我说的,只需将init作为元素传递给let矩阵:[[String]=.initrows:3,columns:3,element:.initprotocol HasInit{init}扩展字符串:HasInit{}扩展rangereplacablecollection,其中元素:rangereplacablecollection,Element.Element:HasInit{initrows:Int,columns:Int{self.initrepeating:.initrepeating:Element.Element,count:columns,count:rows}首选传递init。