2016-05-30 18 views
2

私はオブジェクトの配列を持っています。 私はその名前のプロパティに基づいてオブジェクトを比較することによって、この配列内の個別の要素を取得したいオブジェクトプロパティで配列内の異なる要素を取得

class Item { 
var name: String 
init(name: String) { 
    self.name = name 
} 
} 
let items = [Item(name:"1"), Item(name:"2"), Item(name:"1"), Item(name:"1"),Item(name:"3"), Item(name:"4")] 

結果:

let items = [Item(name:"1"), Item(name:"2"),Item(name:"3"), Item(name:"4")] 

どのように私は迅速にこれを行うことができますか?これはあなたを助ける

答えて

1

希望:ここ

class Item:Equatable, Hashable { 
    var name: String 
    init(name: String) { 
     self.name = name 
    } 
    var hashValue: Int{ 
     return name.hashValue 
    } 

} 

func ==(lhs: Item, rhs: Item) -> Bool { 
    return lhs.name == rhs.name 
} 


let items = [Item(name:"1"), Item(name:"2"), Item(name:"1"), Item(name:"1"),Item(name:"3"), Item(name:"4")] 

var uniqueArray = Array(Set(items)) 
+0

この関数 'func ==(lhs:Item、rhs:Item) - > Bool {'はグローバルスコープにあります。 –

+0

はいok @Bista – iMuzahid

3

は、指定されたキーに基づいてオブジェクトのユニークなリストを返すために、アレイの拡張機能である:

extension Array { 
    func unique<T:Hashable>(by: ((Element) -> (T))) -> [Element] { 
     var set = Set<T>() //the unique list kept in a Set for fast retrieval 
     var arrayOrdered = [Element]() //keeping the unique list of elements but ordered 
     for value in self { 
      if !set.contains(by(value)) { 
       set.insert(by(value)) 
       arrayOrdered.append(value) 
      } 
     } 

     return arrayOrdered 
    } 
} 

あなたが行うことができますたとえば、次のように

let uniqueBasedOnName = items.unique{$0.name} 
関連する問題