当前位置: 首页 > 面试题库 >

从二维数组获取列-如何限制扩展中的数组类型?

盖晋
2023-03-14
问题内容

我想在Swift中扩展Array,以在2D数组的每个数组或列中返回单个元素。到目前为止,我有:

extension Array where // what goes here?
    func getColumn( column: Int ) -> [ Int ] {
        return self.map { $0[ column ] }
    }
}

我相信我需要在之后指定2D数组where,但是我一直无法找出正确的方法。

where?之后指定2D数组的正确语法是什么?

我也很好奇,如果有很好的文档说明如何指定where扩展后的可用内容。我在Apple的Swift扩展文档中找不到

提前致谢。


问题答案:

您需要限制Element数组的类型。下标方法在CollectionType协议中定义:

public protocol CollectionType : Indexable, SequenceType {
    // ...
    public subscript (position: Self.Index) -> Self.Generator.Element { get }
    // ...
}

因此,您可以为元素为集合的数组定义扩展方法:

extension Array where Element : CollectionType {
    func getColumn(column : Element.Index) -> [ Element.Generator.Element ] {
        return self.map { $0[ column ] }
    }
}

例:

let a = [[1, 2, 3], [4, 5, 6]]
let c = a.getColumn(1)

print(c) // [2, 5]

您甚至可以将其定义为其他下标方法:

extension Array where Element : CollectionType {
    subscript(column column : Element.Index) -> [ Element.Generator.Element ] {
        return map { $0[ column ] }
    }
}

let a = [["a", "b", "c"], [ "d", "e", "f" ]]
let c = a[column: 2]
print(c) // ["c", "f"]

Swift 3 更新

extension Array where Element : Collection {
    func getColumn(column : Element.Index) -> [ Element.Iterator.Element ] {
        return self.map { $0[ column ] }
    }
}

或作为下标:

extension Array where Element : Collection {
    subscript(column column : Element.Index) -> [ Element.Iterator.Element ] {
        return map { $0[ column ] }
    }
}


 类似资料:
  • 问题内容: 好的,所以我有一个二维数组z [50][50],因此z的大小是50*50,但是如果我说z.length,我只能得到50。如何获得2D数组的实际大小? 问题答案: 在Java中,二维数组实际上是长度可能不同的数组的数组(不能保证在二维数组中第二维数组的长度都相同) 您可以将任何第二维数组的长度作为where 。 如果将二维数组视为矩阵,则可以简单地获取和,但是请注意,您可能会假设第二维的

  • 问题内容: 如果不知道该如何获取数组的第二维?仅给出第一维度。 例如,在 如何获得的第二维的值,即3。 谢谢 问题答案: 哪 三个? 您已经创建了一个多维数组。是一个int数组的数组;您有两个长度为三的数组。 会给你第一个数组的长度。 另外值得注意的是,您不必像以前那样初始化多维数组,这意味着所有数组的长度不必相同(或根本不存在)。

  • 问题内容: 我有并想要一些函数,调用的结果是新数组。 问题答案: 看一眼

  • 问题内容: 如何扩展Swift 或带有自定义功能工具的类型? 浏览Swift的API文档可发现Array方法是的扩展,例如: 当复制和粘贴相同的源并尝试任何变体时,例如: 它无法生成并显示以下错误: 标称类型不能扩展 使用完整类型定义失败,即: 并且也无法使用和。 奇怪的是,Swift让我扩展了一个无类型数组: 它让我打电话给: 但是我无法创建适当的泛型类型扩展,因为当类型流过该方法时,该类型似乎

  • 当复制和粘贴相同的源并尝试任何变体时,如: 它无法生成,错误为: 无法扩展标称类型 奇怪的是,Swift让我用以下代码扩展一个非类型化数组: 它让我调用: 但是我不能创建一个合适的泛型类型扩展,因为当类型流经方法时,它似乎丢失了,例如,试图用以下内容替换Swift的内置筛选器:

  • 问题内容: 我需要为正在进行的项目制作一个相当大的二维数组的副本。我有两个2D阵列: 我也有两种方法来进行复制。我需要复制数组,因为当前会定期更新。 和 但是,这不起作用。如果我叫old,对current进行更新,然后再调用keepold,则current不等于原来的值。为什么会这样呢? 谢谢 问题答案: 或使两个数组引用相同的东西,因此,如果你随后修改,也会被修改。要将一个数组的内容复制到另一个