2017-05-03 57 views
0

我是新來的,我做的雨燕在一些運動,我發現這個問題:段錯誤斯威夫特遊樂場

當我嘗試執行此代碼我得到一個分段錯誤,我想不通爲什麼。

class Persona{ 
    private var nome:String? 
    private var cognome:String? 
    private var eta:Int? 

    public var Sesso:String{ 
     get{ 
      return Sesso 
     } 
     set{ 
      if newValue=="M" || newValue == "m" { 
       Sesso="Maschio" 
      } 
      else{ 
       Sesso="Femmina" 
      } 
     } 
    } 
    init(nome:String, cognome:String, eta:Int) 
    { 
     self.nome=nome 
     self.cognome=cognome 
     self.eta=eta 
    } 
    init(){} 
    func getNome()->String{ return nome! } 
    func getCognome()->String{ return cognome! } 
    func getEta()->Int{ return eta! } 

    func setNome(nome:String)->(){ self.nome=nome } 
    func setCognome(cognome:String)->(){ self.cognome=cognome } 
    func setEta(eta:Int)->(){ self.eta=eta } 

} 
var p1 = Persona(nome:"AAAA",cognome:"BBBB",eta:22) 
p1.Sesso = "M" 
p1.setEta(eta:44) 
print("\(p1.getNome()) \t \(p1.getCognome()) \t \(p1.getEta()) \t \(p1.Sesso)") 
p1.setEta(eta:22) 
+0

請張貼錯誤消息也沿問題 –

+0

我沒有錯誤消息,只是一個普通的「錯誤「來自Xcode操作系統和IBM Swift Sandbox – MogaWine

回答

1

你基本上是試圖用一個computed property

除了存儲性能,類,結構和枚舉可以定義計算的特性,這實際上並不存儲值。相反,他們提供了一個getter和一個可選的setter來間接檢索和設置其他屬性和值。

這裏的關鍵是「實際上沒有存儲值」。當您嘗試使用get之三時,可以看到更清晰的信息,因爲print(p1.Sesso)也會導致崩潰,因爲您最終陷入無限循環的吸氣器中,一次又一次地調用自己。你應該做的就是定義計算的屬性,但在同一時間界定其實際持有的數據的另一個存儲的屬性:

private var _sesso:String = "" 
public var Sesso:String{ 
    get{ 
     return _sesso 
    } 
    set{ 
     if newValue=="M" || newValue == "m" { 
      _sesso="Maschio" 
     } 
     else{ 
      _sesso="Femmina" 
     } 
    } 
} 
+0

的」Segmentation Fault或類似錯誤「謝謝,所以我必須使用」backup「var – MogaWine

0

問題是你不能在自己的getter和setter中訪問一個變量。

相反,你可以使用didSet

public var Sesso : String{ 
    didSet { 
     if Sesso == "M" || Sesso == "m" { 
      Sesso = "Maschio" 
     } 
     else{ 
      Sesso = "Femmina" 
     } 
    } 
} 

,你可以瞭解更多關於getter和setter從this答案,還可以檢查apple documentation on Properties更多的澄清。