Para mi app de iOS, tengo un modelo algo como

class Person {
    var Id: Int
    var Name: String

    init(id: Int, name: String?) {
        self.Id = id
        self.Name = name ?? ""
    }
}

Después en mi ViewController cuando me carga los datos desde el servidor puedo añadir algunas personas a una matriz

class ViewController: UIViewController {
    var people:[Person] = []

    override func viewDidLoad() {
        self.loadPeople()
    }

    func loadPeople() {
        //This data will be coming from a server request
        //so is just sample. It could have users which 
        //already exist in the people array

        self.people.append(Person(id: "1", name: "Josh"))
        self.people.append(Person(id: "2", name: "Ben"))
        self.people.append(Person(id: "3", name: "Adam"))
    }
}

Lo que ahora estoy tratando de todo es activar el people matriz en un Set<Person> y así no tendrá que agregar duplicados. Es esto posible o tengo que cambiar mi lógica?

InformationsquelleAutor | 2015-09-06

2 Comentarios

  1. 56

    Para hacer un conjunto de Person usted necesita para hacer que se ajusten a Equatable y Hashable protocolos:

    class Person: Equatable, Hashable {
        var Id: Int
        var Name: String
    
        init(id: Int, name: String?) {
            self.Id = id
            self.Name = name ?? ""
        }
    
        var hashValue: Int {
            get {
                return Id.hashValue << 15 + Name.hashValue
            }
        }
    }
    
    func ==(lhs: Person, rhs: Person) -> Bool {
        return lhs.Id == rhs.Id && lhs.Name == rhs.Name
    }

    A continuación, puede utilizar el conjunto de personas que, como este:

    var set = Set<Person>()
    set.insert(Person(id: 1, name: "name"))
    • Yo personalmente uso XOR combinar hash, pero +1 para la inclusión de la Hashable protocolo en su respuesta.
    • Hashable hereda de Equatable, para declarar la clase como class Person: Hashable { ... } sería suficiente. Por supuesto, la adición de Equatable explícitamente no hace daño.
    • ¿podría explicar el cambio de bits 15 parte y por qué usaron 15 no?
    • Estoy usando los bits de cambio debido a que (probablemente) reduce las colisiones de hash. No hay ninguna razón por la que el uso de 15 – usted puede utilizar Id.hashValue << 30 + Name.hashValue y va a trabajar.
  2. 7

    Con Swift 2.0, Hashable y Equitativa es una parte de NSObject. Todo lo que necesitas hacer es reemplazar «isEqual» y «var hash:» para la propiedad de interés. En este caso: «Identificador», Conjunto de excluir a la Persona de los objetos con la misma Id.

        class Person: NSObject {
            var Id: Int
            var Name: String
    
            init(id: Int, name: String?) {
                self.Id = id
                self.Name = name ?? ""
            }
    
            override var hash: Int {
            return Id.hashValue
       }
    
            override func isEqual(object: AnyObject?) -> Bool {
                guard let rhs = object as? Person else {
                    return false
                }
                let lhs = self
    
                return lhs.Id == rhs.Id
            }
    
    
        }
    
              func mergeArrays(){
           let person1 = Person(id: 1, name: "Tom")
           let person2 = Person (id: 2, name: "John")
           let person3 = Person(id: 3, name: "Adam")
    
    
           let downloadedPeople  = [person1,person2] //[{NSObject, Id 1, Name "Tom"}, {NSObject, Id 2, Name "John"}] 
    
           let peopleStoredLocally = [person1,person3] //[{NSObject, Id 1, Name "Tom"}, {NSObject, Id 3, Name "Adam"}]
    
           let downloadedPeopleSet = Set(downloadedPeople) //{{NSObject, Id 2, Name "John"}, {NSObject, Id 1, Name "Tom"}}
    
    
           let mergedSet = downloadedPeopleSet.union(peopleStoredLocally) //{{NSObject, Id 2, Name "John"}, {NSObject, Id 3, Name "Adam"}, {NSObject, Id 1, Name "Tom"}}
    
    
           let mergedArray = Array(mergedSet)//[{NSObject, Id 2, Name "John"}, {NSObject, Id 3, Name "Adam"}, {NSObject, Id 1, Name "Tom"}]
    
        }
    • Usted probablemente no debería utilizar objC tipos para una rápida aplicación, a menos que usted realmente tiene que. Así que me gustaría recomendar el uso de la versión independiente de los protocolos en lugar de heredar de NSObject.

Dejar respuesta

Please enter your comment!
Please enter your name here