2017-09-07 7 views
0

Dans mon application, je souhaite autoriser l'utilisateur à me donner un nom d'affichage lors de son inscription, mais s'il ne m'en donne pas, je souhaite en créer un en utilisant son prénom et son nom initiale. Cela m'a semblé correspondre un peu au paradigme de la propriété calculée, mais pas exactement. J'ai essayé de le faire dans ma classe:Propriété calculée non calculée sur l'ensemble

var displayName: String { 
    get { 
     if (!self.displayName.isEmpty) { 
      return self.displayName 
     } 
     else { 
      let index = self.lastName.index((self.lastName.startIndex), offsetBy: 1) 

      return self.firstName + " " + self.lastName.substring(to: index) 
     } 
    } 
    set(displayName) { 
     self.displayName = displayName 
    } 
} 

Mais il s'est écrasé à plusieurs endroits différents. Est-ce une situation correcte pour une propriété calculée, ou devrais-je simplement créer une propriété régulière et vérifier pour displayName.isEmpty et le définir à firstname.lastinitial si c'est le cas?

Merci d'avance.

Répondre

1

Votre application se bloque pour un problème de boucle.

Sur votre rendez-vous:

if (!self.displayName.isEmpty) { 
    return self.displayName 
} 

Je vous propose une solution comme ceci:

class User { 

    private var compoundName: String 
    var displayName: String { 
     get { 
      guard !self.compoundName.isEmpty else { 
       return self.compoundName 
      } 
      if let firstLastNameChar = self.lastName.characters.first { 
       return return "\(self.firstName) \(firstLastNameChar)" 
      } 
      return self.firstName 
     } 
     set(displayName) { 
      self.compoundName = displayName 
     } 
    } 

} 
+0

Thanx, @Luca. C'est ce que je soupçonnais de devoir faire. – NLam

2

Les accidents de code parce que dans le setter l'affectation self.displayName = appelle le compositeur qui appelle le poseur qui appelle le setter ... qui provoque une boucle infinie. Le setter d'une propriété calculée doit être calculé depuis un autre emplacement.

Une solution adaptée pour une propriété calculée avec getter et setter est à la carte firstName et lastName de et à displayName par exemple

var displayName: String { 
    get { 
     return firstName.isEmpty ? lastName : firstName + " " + lastName 
    } 
    set { 
     let components = newValue.components(separatedBy: " ") 
     if components.count == 2 { 
      firstName = components[0] 
      lastName = components[1] 
     } else { 
      firstName = "" 
      lastName = newValue 
     } 
    } 
} 

Note: Il est une mauvaise idée de renommer la valeur par défaut newValue au nom à la La propriété newValue ne doit pas être liée à la propriété.

+0

"' newValue' ne doit pas être liée à la propriété "Why? – Honey

+0

Merci. C'est une solution valide, mais ne tient pas compte du fait que l'utilisateur donne son propre displayName. La réponse de Luca est plus ce que je pensais devoir être fait. – NLam