2016-08-22 3 views
2

En Java, nous avons:équivalent de Java LinkedHashSet à Swift

private Set<AutoComplete> hashList = new LinkedHashSet<>(); 

et:

public class AutoComplete { 

    private String name; 
    private String id; 

    //...geters and setters 

    @Override 
    public boolean equals(Object o) { 
     if (o instanceof AutoComplete) { 
      AutoComplete autoComplete = (AutoComplete) o; 
      if (name.equals(autoComplete.name) && id.equals(autoComplete.id)) 
       return true; 
     } 
     return false; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 17; 
     int hashMultiplikator = 79; 
     try { 
      hash = hashMultiplikator * hash 
        + getId().hashCode(); 
     } catch (java.lang.Exception e) { 
      e.printStackTrace(); 
      MLogger.logException("autocomplete id can't be null", e); 
     } 
     return hash; 
    } 

Ensuite, lorsque vous ajoutez des éléments à hashList, les valeurs en double autorisées coutume et la liste est une sorte.

Donc, mes questions est de savoir comment faire cela dans Swift ?!

Je l'ai déjà vu Does there exist within Swift's API an easy way to remove duplicate elements from an array?

et quand je passe tableau de saisie semi-automatique func uniq,

var namesAndIds : [AutoComplete] = [] 

(pour supprimer les doublons :)

namesAndIds.appendContentsOf(SingletonMappingContacts.sharedInstance.autoComplete) 
namesAndIds = uniq(namesAndIds) 

func uniq<S : SequenceType, T : Hashable where S.Generator.Element == T>(source: S) -> [T] { 
     var buffer = [T]() 
     var added = Set<T>() 
     for elem in source { 
      if !added.contains(elem) { 
       buffer.append(elem) 
       added.insert(elem) 
      } 
     } 
     return buffer 
    } 

J'ai ceci: valeur de type AutoComplete n'a aucun membre elemet

saisie semi-automatique:

class AutoComplete{ 
    var id : String 
    var name : String 
    init(id: String,name: String) { 
     self.name = name 
     self.id = id 
    } 
} 
+0

Que signifie exactement fonctionne pas? Montrez votre code Swift. –

+0

@MartinR modifié – Hoven

+0

Comment la saisie semi-automatique est-elle définie?- Comme toujours, un (petit) * exemple * autonome serait extrêmement utile. –

Répondre

-1

Swift vous pouvez utiliser Set.

Comme dans la documentation:

stocke ensemble de valeurs distinctes du même type dans une collection sans commande définie. Vous pouvez utiliser un ensemble au lieu d'un tableau lorsque l'ordre des articles n'est pas important ou lorsque vous devez vous assurer qu'un article n'apparaît qu'une seule fois.

Un type doit être compatible pour être stocké dans un ensemble, c'est-à-dire que le type doit fournir un moyen de calculer lui-même une valeur de hachage.

Se conforme simplement au protocole Hashable de la bibliothèque standard de Swift.

Ensuite, vous pouvez l'utiliser comme:

var letters = Set<Character>() //letters == [] 
letters.insert("a")    //letters == ["a"] 
letters.insert("a")    //letters == ["a"] - no duplicates 
+3

L'ensemble n'est pas un équivalent complet de LinkedHashSet (qui * préserve * l'ordre des éléments). –

+0

Absolument correct @MartinR. Mais dans la question, il stocke le LinkedHashSet dans un Set privé et ses exigences étaient d'interdire les doublons. –

+0

S'il a besoin d'une commande spécifique, il peut toujours implémenter le LinkedHashSet lui-même. –

0

Pour un qui aiment savoir, je fini par éviter duplicate insertion issue comme ci-dessous. Mais CECI NE SERAIT PAS COMME LinkedHashSet Donc le problème existe toujours!

j'ai créé

var namesAndIds = Set<AutoComplete>() 
var finalAutoCompleteList = [AutoComplete]() 

puis corrigeais classe saisie semi-automatique:

public class AutoComplete:NSObject{ 
    var id : String 
    var name : String 
    init(id: String,name: String) { 
     self.name = name 
     self.id = id 
    } 
    override public func isEqual(object: AnyObject?) -> Bool { 
     if let object = object as? AutoComplete { 
      return id == object.id 
     } else { 
      return false 
     } 
    } 

    override public var hash: Int { 
     return id.hashValue 
    } 

} 

et a finalement ajouté réglé sur tableau

finalAutoCompleteList = Array(namesAndIds)