2017-09-28 14 views
0

にgetterとsetterで変数自体を設定することはできません私はゲッターに一例を行うと、例のセッターたが迅速

import Foundation 

class person 
{ 
    var first_name:String 
    { 
     get 
     { 
      return self.first_name 
     } 
     set 
     { 
      if (newValue.rangeOfCharacter(from: CharacterSet.decimalDigits) != nil){ 
       print("please enter valid name") 
      } 
      else 
      { 
       self.first_name = newValue 
      } 
     } 
    } 
} 

let person1 = person.init() 
person1.first_name = "rahul" 

を下回っているが、これは私にエラー を与えますが、私はこの例を実行する

import Foundation 

class person 
{ 
    var name = "" 
    var first_name:String 
    { 
     get 
     { 
      return name 
     } 
     set 
     { 
      if (newValue.rangeOfCharacter(from: CharacterSet.decimalDigits) != nil){ 
       print("please enter valid name") 
      } 
      else 
      { 
       name = newValue 
      } 
     } 
    } 
} 

let person1 = person.init() 
person1.first_name = "rahul" 
print(person1.first_name) 

getterとsetterを使用している場合は、私の質問が私の出力を与えるので、上記の例で行ったように変数を取得または設定できないのはなぜですか?ここに

+0

"これは私にエラーを与えますが、この例では"何のエラー? – Larme

+0

最初の例では、ゲッターとセッターを持つ*計算されたプロパティ*が再帰的に呼び出されます* ... –

+0

クラスの代わりに構造体を使用し、失敗可能なイニシャライザを作成する必要があります。 'struct Person { let name:String; init?(name:String){ ガード名.rangeOfCharacter(from:.decimalDigits)== nil else {return nil}; self.name = name } } ' –

答えて

0

さて、first_nameプロパティを設定しているとします。だから私はそのセッターと呼ぶ。セッターは、文字列が有効であることを確認します、その後、呼び出します

self.first_name = newValue 

これはfirst_nameのセッターを呼び出します。文字列がまだ有効であるので、セッターが呼び出されます:

self.first_name = newValue 

これはfirst_nameのセッターを呼び出します。文字列がまだ有効であるので、セッターが呼び出されます:

self.first_name = newValue 

これはfirst_nameのセッターを呼び出します。文字列がまだ有効であるので、セッターが呼び出されます:

self.first_name = newValue 

これはfirst_nameのセッターを呼び出します。文字列がまだ有効であるので、セッターが呼び出されます:

self.first_name = newValue 

これはfirst_nameのセッターを呼び出します。文字列がまだ有効であるので、セッターが呼び出されます:

self.first_name = newValue 

これはfirst_nameのセッターを呼び出します。文字列がまだ有効であるので、セッターが呼び出されます:

self.first_name = newValue 

これはfirst_nameのセッターを呼び出します。文字列がまだ有効であるので、セッターが呼び出されます:

self.first_name = newValue 

これはfirst_nameのセッターを呼び出します。文字列がまだ有効であるので、セッターが呼び出されます:

self.first_name = newValue 

これはfirst_nameのセッターを呼び出します。文字列がまだ有効であるので、セッターが呼び出されます:

self.first_name = newValue 

これはfirst_nameのセッターを呼び出します。文字列がまだ有効であるので、セッターが呼び出されます:

self.first_name = newValue 

これはfirst_nameのセッターを呼び出します。文字列がまだ有効であるので、セッターが呼び出されます:

self.first_name = newValue 

これはfirst_nameのセッターを呼び出します。文字列がまだ有効であるので、セッターが呼び出されます:

self.first_name = newValue 

これはfirst_nameのセッターを呼び出します。文字列がまだ有効であるので、セッターが呼び出されます:

self.first_name = newValue 

これはfirst_nameのセッターを呼び出します。文字列がまだ有効であるので、セッターが呼び出されます:

self.first_name = newValue 

これはfirst_nameのセッターを呼び出します。文字列がまだ有効であるので、セッターが呼び出されます:

self.first_name = newValue 

これはfirst_nameのセッターを呼び出します。文字列がまだ有効であるので、セッターが呼び出されます:

self.first_name = newValue 

これはfirst_nameのセッターを呼び出します。文字列がまだ有効であるので、セッターが呼び出されます:

self.first_name = newValue 

これはfirst_nameのセッターを呼び出します。文字列がまだ有効であるので、セッターが呼び出されます:

self.first_name = newValue 

これはfirst_nameのセッターを呼び出します。文字列がまだ有効であるので、セッターが呼び出されます:

self.first_name = newValue 

これはfirst_nameのセッターを呼び出します。文字列がまだ有効であるので、セッターが呼び出されます:

self.first_name = newValue 

これはfirst_nameのセッターを呼び出します。文字列がまだ有効であるので、セッターが呼び出されます:

self.first_name = newValue 

これはfirst_nameのセッターを呼び出します。文字列がまだ有効であるので、セッターが呼び出されます:

self.first_name = newValue 

これはfirst_nameのセッターを呼び出します。文字列はまだ有効なので、セッターは次の呼び出しを行います。

self.first_name = newValue 

これまでのところ、問題があります。あまりにも多くの再帰のためにプログラムがクラッシュするまで、これは永遠に続くでしょう。ゲッターとセッターはこのように自分自身を呼ぶことはできません。代わりに、別のprivate var _first_nameプロパティを作成し、first_nameのゲッターとセッターにアクセスさせてください。