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

在Swift中创建扩展以从数组中过滤nil

缑兴贤
2023-03-14
问题内容

我正在尝试对Array进行扩展,以允许将可选T的数组转换为非可选T的数组。

例如,这可以写成这样的自由函数:

func removeAllNils(array: [T?]) -> [T] {
    return array
        .filter({ $0 != nil })   // remove nils, still a [T?]
        .map({ $0! })            // convert each element from a T? to a T
}

但是,我无法将此作为扩展。我试图告诉编译器,扩展名仅适用于可选值数组。这是我到目前为止的内容:

extension Array {
    func filterNils<U, T: Optional<U>>() -> [U] {
        return filter({ $0 != nil }).map({ $0! })
    }
}

(它不会编译!)


问题答案:

不可能限制为通用结构或类定义的类型-数组旨在与任何类型一起使用,因此您不能添加适用于类型子集的方法。类型约束只能在声明泛型时指定

实现所需功能的唯一方法是创建全局函数或静态方法-在后一种情况下:

extension Array {
    static func filterNils(array: [T?]) -> [T] {
        return array.filter { $0 != nil }.map { $0! }
    }
}

var array:[Int?] = [1, nil, 2, 3, nil]

Array.filterNils(array)

或简单地使用compactMap(以前为flatMap),该方法可用于删除所有nil值:

[1, 2, nil, 4].compactMap { $0 } // Returns [1, 2, 4]


 类似资料:
  • 问题内容: 我在Swift中有一组对象。每个对象都有餐厅的属性,例如名称,类型,位置等。如果我想将数组中所有包含类型的对象保留为“ Sushi”,该如何过滤数组。 具有2个对象的示例数组。过滤器应保留第一个对象(类型:sushi): 当前代码(但我不确定过滤器是否可以搜索的数组): 问题答案: 您的数组,是一个对象数组。因此,对于数组,您可以执行以下操作: 基于我们正在处理自定义对象的假设,我的原

  • 问题内容: 我想扩展Array类,以便它可以知道它是否已排序(升序)。我想添加一个称为的计算属性。如何声明数组的元素具有可比性? 我目前在Playground中的实现 错误 当然,我仍然遇到错误,因为Swift不知道如何比较元素。如何在Swift中实现此扩展?还是我在这里做错了什么? 问题答案: 自由函数的替代解决方案是执行Swift的内置函数和方法,并要求您将合适的比较器传递给该方法:

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

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

  • 我有一个非常简单的练习,我注册客户端名称(字符串),我使用数组来做到这一点,所以当我添加一个新的我将使用另一个辅助数组,然后增加原来的长度,或者我将使用System.array复制,有没有其他方法,逐渐增加数组长度,因为你需要添加元素到该数组,不涉及辅助数组?

  • 问题内容: 在目标c中,我可以创建一个类数组并在方法中使用它 但是,swift没有“类”功能。返回类的元类型会导致错误 最后一行导致“致命错误:数组元素无法桥接到Objective-C” 如何在Swift中创建类数组? 问题答案: 显然,此问题已在Beta 3中修复,因此不再需要解决方法 我发现了一个纯粹的Swift hack: 先前的答案 我无法在Swift中以任何方式获取实例。似乎无法直接从转