在Swift中创建数组

时间:2016-08-30 14:44:47

标签: swift

我尝试从数组中创建 set 以使元素唯一。 我认为使用Set初始化程序来完成这项工作将是一种优雅的方法。所以我创建了一个数组并尝试使用该数组初始化我的新 set 。 但是编译器在抱怨。我尝试使用Integer值,它就像一个魅力。但是对于我自己的课程,它不起作用。我还认为Equatable Protocol是正确的方法......但正如你所看到的,它并没有解决我的问题。

考虑以下游乐场:

 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

编译器抱怨

  

无法调用初始化程序集< _>参数类型为[Object]

我需要实施哪种协议才能使事情有效?

1 个答案:

答案 0 :(得分:9)

如果您按下了命令,请点按'在Xcode的Set上,它会将您带到Set类型的定义。你去吧:

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

如Rob所述,元素需要向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