gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 05:33:15 24 4
gpt4 key购买 nike

我在 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??? #>
})

问题是我不知道 block 中应该包含什么。请帮助迁移它?

最佳答案

swift 4 更新

在 Swift 4 中,感谢 the ability to have where clauses on associated types , Collection现在强制执行 Indices Element type 与 Collection 的类型相同的 Index .

因此这意味着我们可以说:

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
}
}

swift 3

Sequence Swift 3 中的协议(protocol)仍然有一个 contains(_:) 方法,如果序列是 Equatable,它接受序列的一个元素元素:

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

您遇到的问题是由于 Collection 的类型发生了变化。的 indices属性(property)要求。在 Swift 2 中,它的类型是 Range<Self.Index> – 然而在 Swift 3 中,它的类型是 Indices (Collection 协议(protocol)的关联类型):

/// 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协议(protocol)本身来表达IndicesIterator.Element类型为 Index ( this will however be possible in a future version of Swift ),编译器无法知道您可以传递 Index 类型的东西进入contains(_:) .这是因为目前类型完全有可能符合 Collection并实现 Indices使用它想要的任何元素类型。

因此,解决方案是简单地限制您的扩展以确保 Indices 确实Index 类型的元素, 让你通过 index进入contains(_:) :

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
}
}

关于swift - 无法在 Swift 3 的 Collection 扩展中使用 indices.contains(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40331728/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com