我在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??? #>
})
问题是我不知道块中应包含什么。请帮忙进行迁移吗?
在夫特4,由于能力具有where
对相关联的类型的子句,Collection
现在强制执行Indices
的Element
类型是相同的类型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
}
}
Sequence
Swift
3中的协议仍然有一个contains(_:)
方法,如果序列是Equatable
元素,则该方法可以接受序列的元素:
extension Sequence where Iterator.Element : Equatable {
// ...
public func contains(_ element: Self.Iterator.Element) -> Bool
// ...
}
您遇到的问题是由于Collection
的indices
财产要求类型发生了变化。在Swift
2中,它是类型Range<Self.Index>
-但是在Swift
3中,它是类型Indices
(Collection
协议的关联类型):
/// 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
协议 本身 表达Indices
s
Iterator.Element
是类型的Index
(但是在Swift的未来版本中可能会出现这种情况),因此编译器无法知道您可以将type传递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
}
}
问题内容: 我正在尝试编写一个简单的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:”。 问题答案: 您应该阅读有关内容安全政策的信息 使用以下命令完成清单文件: