![](/img/trans.png)
[英]How can I cast a an array of protocol X to `Hashable` if the class conform to X is Hashable?
[英]How can I cast an array of [AnyObject] to an array of [Hashable] or [AnyHashable] in Swift?
我有一个AnyObjects( [AnyObject]
)数组。 我知道其中大多数都是可Hashable
。 我如何将这个AnyObject“投射”到Hashable / AnyHashable? AnyHashable仅将Hashable对象作为参数。
为了投一个对象到另一个你用as
。 但是不能自动转换的对象(在您的情况下)您需要将其as?
还是as!
。 所以最简单的方法是:
let hashableArray: [AnyHashable] = array as! [AnyHashable] // Will crash if even one object is not convertible to AnyHashable
let hashableArray: [AnyHashable]? = array as? [AnyHashable] // Will return nil if even one object is not convertible to AnyHashable
因此,一个可能崩溃,而另一个可能会生成一个可选数组。
自从您写了“我知道这些大多数都是可Hashable
” Hashable
我会说这些都不是可以的。 您需要对每个对象进行转换,然后决定如何处理其余对象。 最基本的方法是:
func separateHashable(inputArray: [AnyObject]) -> (hashable: [AnyHashable], nonHashable: [AnyObject]) {
var hashableArray: [AnyHashable] = [AnyHashable]()
var nonHashableArray: [AnyObject] = [AnyObject]()
inputArray.forEach { item in
if let hashable = item as? AnyHashable {
hashableArray.append(item)
} else {
nonHashableArray.append(item)
}
}
return (hashableArray, nonHashableArray)
}
因此,此方法将转换您的数组并将其拆分为两个数组。 然后,您可以简单地let hashableArray: [AnyHashable] = separateHashable(inputArray: array).hashable
。
但是,如果您只想提取可compactMap
项,则可以在数组compactMap
上使用便捷方法
let hashableArray: [AnyHashable] = array.compactMap { $0 as? AnyHashable }
但是总的来说,这一切都很危险。 这就是为什么您不能简单地将其转换为Hashable
。 原因是2个项目可能都是可散列的,但属于不同的类别。 然后这两个项目可能会产生相同的哈希,即使它们不代表相同的项目也是如此。 想象一下,有2个班级:
struct Question: Hashable {
let id: String
var hashValue: Int { return id.hashValue }
}
struct Answer: Hashable {
let id: String
var hashValue: Int { return id.hashValue }
}
现在,如果我创建一个像这样的数组:
let array: [AnyObject] = [
Question(id: "1"),
Answer(id: "1")
]
这两个项目都会产生相同的哈希值,而其中一个可能会覆盖另一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.