2017-05-03 89 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更多的澄清。