2016-05-30 86 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

是的,好吧@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}