2017-09-07 31 views
0

私のアプリでは、登録時にユーザーに表示名を与えることを許可したいが、私には表示名を与えない場合は、初期。計算されたプロパティが計算されない

これは、計算されたプロパティのパラダイムに多少適合するように見えましたが、正確ではありません。私はクラスでこれをやろうとしました:

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

しかし、いくつかの場所でクラッシュしました。これは、計算されたプロパティの正しい状況ですか、または私は通常のプロパティを作成し、displayName.isEmptyをチェックして、それがfirstname.lastinitialに設定する必要がありますか?

Thanx事前に。

答えて

1

ループの問題でアプリがクラッシュします。

あなたが持っているあなたのGETで

:なぜならセッターでセッターを呼び出すセッターを呼び出すself.displayName =割り当てを

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、@ルカ。これは私が私がしなければならないと思ったものです。 – NLam

2

コードがクラッシュ:私はあなたにこのようなソリューションを提案

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

setterを呼び出して、無限ループを引き起こします。計算されたプロパティの設定子は計算されている必要があります。

ゲッターとセッターとの計算されたプロパティに適したソリューションは、からとdisplayNameに例えば

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

firstNamelastNameをマッピングすることです。それが名前にデフォルトnewValueの名前を変更するために悪い考えですプロパティ、newValueはプロパティと関連していてはいけません。

+0

"' newValue'は、プロパティ "なぜですか? – Honey

+0

ありがとうございます。これは有効な解決策ですが、ユーザーが独自のdisplayNameを指定することは考慮していません。 @ルカの答えは、私が何をする必要があると思っていたものです。 – NLam

関連する問題