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

在Swift 3的Collection扩展中无法使用index.contains()

冀永寿
2023-03-14
问题内容

我在Swift 2.3中编写了以下扩展名:

extension CollectionType {
    /// Returns the element at the specified index iff it is within bounds, otherwise nil.
    subscript (safe index: Index) -> Generator.Element? {
        return indices.contains(index) ? self[index] : nil
    }
}

但是,事实证明,Swift 3.0没有contains()功能。相反,它为我提供了此方法的以下语法:

indices.contains(where: { (<#Self.Indices.Iterator.Element#>) -> Bool in
    <# code ??? what should it do??? #>
})

问题是我不知道块中应包含什么。请帮忙进行迁移吗?


问题答案:

Swift 4更新

在夫特4,由于能力具有where对相关联的类型的子句,Collection现在强制执行IndicesElement类型是相同的类型CollectionIndex

因此,这意味着我们只能说:

extension Collection {

    /// Returns the element at the specified index iff it is within bounds, otherwise nil.
    subscript (safe index: Index) -> Element? {
        return indices.contains(index) ? self[index] : nil
    }
}

迅捷3

SequenceSwift
3中的协议仍然有一个contains(_:)方法,如果序列是Equatable元素,则该方法可以接受序列的元素:

extension Sequence where Iterator.Element : Equatable {
    // ...
    public func contains(_ element: Self.Iterator.Element) -> Bool
    // ...
}

您遇到的问题是由于Collectionindices财产要求类型发生了变化。在Swift
2中,它是类型Range<Self.Index>-但是在Swift
3中,它是类型IndicesCollection协议的关联类型):

/// A type that can represent the indices that are valid for subscripting the
/// collection, in ascending order.
associatedtype Indices : IndexableBase, Sequence = DefaultIndices<Self>

由于Swift目前尚无法让Collection协议 本身 表达Indicess
Iterator.Element是类型的Index(但是在Swift的未来版本中可能会出现这种情况),因此编译器无法知道您可以将type传递Indexcontains(_:)。这是因为,当前完全有可能使类型符合Collection并实现所需Indices
任何 元素类型。

因此,解决方案是简单地限制你的扩展,以确保Indices 不会 有类型的元素Index,让你传递indexcontains(_:)

extension Collection where Indices.Iterator.Element == Index {

    /// Returns the element at the specified index iff it is within bounds, otherwise nil.
    subscript (safe index: Index) -> Iterator.Element? {
        return indices.contains(index) ? self[index] : nil
    }
}


 类似资料:
  • 问题内容: 我正在尝试编写一个简单的Array扩展,该扩展提供了“ distinct”方法。这是我到目前为止的内容: 问题是“包含”语句失败,如下所示: 找不到包含所提供参数的“包含”的重载 我很确定类型约束是正确的。有任何想法吗? 问题答案: 斯威夫特1.x 元素中的元素不必是,即它们不必与。 这意味着您不能为 所有 可能的数组编写该函数。而且Swift不允许您仅扩展Arrays的子集。 这意味

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

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

  • 问题内容: 事实并非如此,这让我感到惊讶。 我认为,如果这样声明,那将是很有意义的: 毕竟,是的集合,不是吗? 那么,为什么没有这样一个很好的实现呢? 感谢Cletus提供的最权威的答案,但是我仍然想知道为什么,如果你已经可以查看(通过),那么它不仅扩展了该接口。 如果a 是a ,则元素是什么?唯一合理的答案是“键值对” 确实会很棒! 但这提供了非常有限的(且不是特别有用的)Map抽象。 但是,如

  • 问题内容: 在这个问题的上下文中,我将探讨如何实现一种属性或方法,该属性或方法将遍历集合中 所有 嵌套级别。 直观地,这应该起作用: 但是,我们不允许将值强制转换为具有关联类型的协议类型。 所以我想使Element类型更明确,例如: 但这显然要求过多的类型推断器。 现在,我退后一步,决定停止尝试将所有内容合并为一个扩展: 现在可以 编译了 -是的!-但调度已关闭:不会绑定到第二个递归版本,但总是绑

  • 问题内容: 我正在尝试使用基本的chrome扩展程序,它像这样 这适用于清单版本1,但是当我将其更改为v2时,出现以下错误。我将不胜感激:) 拒绝加载脚本“ http://sample.com”,因为它违反了以下内容安全策略指令:“ script-src’self’chrome- extension-resource:”。 问题答案: 您应该阅读有关内容安全政策的信息 使用以下命令完成清单文件: