2016-08-30 99 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