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

无法在Swift Array扩展中使用包含

简俊楚
2023-03-14
问题内容

我正在尝试编写一个简单的Array扩展,该扩展提供了“ distinct”方法。这是我到目前为止的内容:

extension Array {
  func distinct() -> T[] {
    var rtn = T[]()

    for x in self {
      var containsItem = contains(rtn, x)
      if !containsItem {
        rtn.append(x)
      }
    }
    return rtn
  }
 }

问题是“包含”语句失败,如下所示:

找不到包含所提供参数的“包含”的重载

我很确定类型约束是正确的。有任何想法吗?


问题答案:

斯威夫特1.x

元素中的元素array不必是Equatable,即它们不必与==

这意味着您不能为 所有 可能的数组编写该函数。而且Swift不允许您仅扩展Arrays的子集。

这意味着您应该将其作为一个单独的函数编写(这也可能就是为什么contains它都不是方法)的原因。

let array = ["a", "b", "c", "a"]

func distinct<T: Equatable>(array: [T]) -> [T] {
    var rtn = [T]()

    for x in array {
        var containsItem = contains(rtn, x)
        if !containsItem {
            rtn.append(x)
        }
    }
    return rtn
}

distinct(array) // ["a", "b", "c"]

Swift 2 / Xcode 7(测试版)更新

Swift 2支持将扩展限制为协议实现的子集,因此现在允许以下操作:

let array = ["a", "b", "c", "a"]

extension SequenceType where Generator.Element: Comparable {
    func distinct() -> [Generator.Element] {
        var rtn: [Generator.Element] = []

        for x in self {
            if !rtn.contains(x) {
                rtn.append(x)
            }
        }
        return rtn
    }
}

array.distinct() // ["a", "b", "c"]

请注意苹果如何SequenceType.contains使用相同的语法添加的。



 类似资料:
  • 问题内容: 我在Swift 2.3中编写了以下扩展名: 但是,事实证明,Swift 3.0没有功能。相反,它为我提供了此方法的以下语法: 问题是我不知道块中应包含什么。请帮忙进行迁移吗? 问题答案: Swift 4更新 在夫特4,由于能力具有对相关联的类型的子句,现在强制执行的类型是相同的类型的。 因此,这意味着我们只能说: 迅捷3 Swift 3中的协议仍然有一个方法,如果序列是元素,则该方法可

  • 这个问题已经被问了好几次了,但没有一个答案对我有效。我试图扩展Express请求对象,使其包含一个属性来存储用户对象。我创建了一个声明文件,

  • 问题内容: 我目前正在使用Selenium来运行Chrome实例来测试网页。每次我的脚本运行时,都会启动一个干净的Chrome实例(清理扩展程序,书签,浏览历史记录等)。我想知道是否可以使用Chrome扩展程序运行脚本。我曾尝试搜索Python示例,但是当我在Google上搜索时什么都没想到。 问题答案: 您应该使用Chrome WebDriver 选项设置要加载的扩展程序列表。这是一个例子: 希

  • 问题内容: 我在数组中有“ UserDetails”结构对象。我想从数组中过滤对象。但是Swift数组中没有“ filteredArrayUsingPredicate”选项。 我的阵列创作 我的用户详细代码是 我创建对象的代码 现在,我要过滤哪个用户ID为“ 1”的用户。 问题答案: Swift数组有一个需要闭包的方法-可以做到这一点: 可以通过多种方式简化封闭过程。闭包的完整声明看起来像这样:

  • 在3.0版中,我们将一些功能移到了单独的包里。本章讲述如何加载扩展包的模块,并且描述了这些包的功能。 8.1 加载扩展包 默认情况下扩展包并没有被加载。你必须稍微设置一下,这样Emacs就可以知道在哪里找到这些扩展包、加载哪些扩展包。总的来说,你应该调用slime-setup函数,并将需要用的包的名字作为一个列表传给它。例如,加载slime-scratch和slime-editing-comman

  • 问题内容: 我想告诉你我的问题。 我的环境: package.json webpack.config.js 总是像这样在{…} ./src/flux/components/BaseComponent.js中的错误模块构建失败:语法错误:D:/APPs/src/flux/components/BaseComponent.js:意外令牌(36:29) name}}); 但是,如果没有webpack,它