How to create array of unique object list in Swift

后端 未结 11 2029
猫巷女王i
猫巷女王i 2020-11-27 05:20

How can we create unique object list in Swift language like NSSet & NSMutableSet in Objective-C.

相关标签:
11条回答
  • 2020-11-27 05:55

    So I think creating a Set with an array is a terrible idea - O(n) is the time complexity of that set.

    I have put together a nice Set that uses a dictionary: https://github.com/evilpenguin/Swift-Stuff/blob/master/Set.swift

    0 讨论(0)
  • 2020-11-27 05:56

    Special case for classes derived from NSObject

    given that default Equitable (& Hashable) conformance in NSObject is basically trash you'd better make sure you provide a proper

    static func == (lhs: YourClassDerivedFromNSObject, rhs: YourClassDerivedFromNSObject) -> Bool {
    

    implementation lest you want plucking the duplicates inserted into Set

    0 讨论(0)
  • 2020-11-27 05:57

    I thought a struct with an internal Dictionary would be the way to go. I have only just started using it, so it’s not complete and I have no idea on performance yet.

    struct Set<T : Hashable>
    {
        var _items : Dictionary<T, Bool> = [:]
    
        mutating func add(newItem : T) {
            _items[newItem] = true
        }
    
        mutating func remove(newItem : T) {
            _items[newItem] = nil
        }
    
        func contains(item: T) -> Bool {
            if _items.indexForKey(item) != nil { return true } else { return false }
        }
    
        var items : [T] { get { return [T](_items.keys) } }
        var count : Int { get { return _items.count } }
    }
    
    0 讨论(0)
  • 2020-11-27 05:57

    I wrote a function to solve this problem.

    public func removeDuplicates<C: ExtensibleCollectionType where C.Generator.Element : Equatable>(aCollection: C) -> C {
        var container = C()
    
        for element in aCollection {
            if !contains(container, element) {
                container.append(element)
            }
        }
    
        return container
    }
    

    To use it, just pass an array which contains duplicate elements to this function. And then it will return a uniqueness-guaranteed array.

    You also can pass a Dictionary, String or anything conforms to ExtensibleCollectionType protocol if you like.

    0 讨论(0)
  • 2020-11-27 05:59
    extension Array where Element: Hashable {
        var setValue: Set<Element> {
            return Set<Element>(self)
        }
    }
    
    let numbers = [1,2,3,4,5,6,7,8,9,0,0,9,8,7]
    let uniqueNumbers = numbers.setValue    // {0, 2, 4, 9, 5, 6, 7, 3, 1, 8}
    
    let names = ["John","Mary","Steve","Mary"]
    let uniqueNames = names.setValue    // {"John", "Mary", "Steve"}
    
    0 讨论(0)
提交回复
热议问题