playgrounds playground para obtener niños mac español cuesta cuanto apple ios swift set equatable

ios - obtener - swift playgrounds para mac



¿Cómo creo un conjunto de objetos personalizados(Swift)? (2)

Con Swift 2.0, Hashable y Equitable forman parte de NSObject. Todo lo que necesita hacer es anular "isEqual" y "var hash:" para la propiedad de su interés. En este caso: "Id", Set excluirá Person-objects con ID idénticos.

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"}] }

Para mi aplicación iOS tengo un modelo algo así como

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

Luego, más adelante en mi ViewController cuando cargo datos del servidor, agrego 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 intento ahora hacer es convertir la matriz de people en un Set<Person> para que no agregue duplicados. ¿Es esto posible o debo cambiar mi lógica?


Para hacer un conjunto de Person debes hacer que se ajuste a los protocolos Equatable y Hashable:

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 }

Entonces puedes usar un conjunto de personas como este:

var set = Set<Person>() set.insert(Person(id: 1, name: "name"))