2016-08-30 102 views
5

我试图创建一个数组中使元素唯一。 我认为这将是一个优雅的方法来使用Set初始值设定器来完成这项工作。所以我创建了一个数组,并尝试使用该数组初始化我的新集合。 但编译器在抱怨。我使用整数值来尝试它,它像一个魅力。但是用我自己的课,它不起作用。我也认为Equatable Protocol是正确的路要走..但如你所见,它不能解决我的问题。在Swift中创建一个数组集

考虑以下游乐场:

import UIKit 

internal struct Object: Equatable { 
    var a: Int 
} 

internal func == (lhs:Object,rhs: Object) -> Bool { 
    return lhs.a == rhs.a 
} 

let array = [Object(a:1),Object(a:1),Object(a:1),Object(a:1),Object(a:2)] 

let set = Set(array) // ERROR 

编译器与抱怨

不能调用初始化设置< _>类型的自变量[对象]

哪个协议我是否需要实施以使事情发挥作用?

+5

'Object'必须符合'Hashable',不只是'Equatable'。 –

+0

可能的重复[减少数组在Swift中设置](http://stackoverflow.com/questions/34161786/reduce-array-to-set-in-swift) – EmilioPelaez

+0

它不是重复的,我明确地询问我需要实现的一种协议。引用的Thread没有提到关于Hashable协议的内容,并且包含使用reduce的构造,这可能导致开发人员陷入错误的解决方案。这篇文章更精确,不应该被标记为重复,以帮助其他堆栈溢出用户更快找到问题的解决方案。 –

回答

8

如果您在Xcode的'Set'上按'命令'单击'',它将带您进入Set类型的定义。还有你去:

/// A collection of unique `Element` instances with no defined ordering. 
public struct Set<Element : Hashable> : Hashable, CollectionType ... 

正如罗布提到的内容需要再次确认Hashable(这又需要Equatable)。

调整你的代码:

import Foundation 

internal struct Object: Hashable { 
    var a: Int 
    var hashValue: Int { return a.hash } 
} 

internal func == (lhs:Object,rhs: Object) -> Bool { 
    return lhs.a == rhs.a 
} 

let array = [Object(a:1),Object(a:1),Object(a:1),Object(a:1),Object(a:2)] 

let set = Set(array) // SUCCESS