Swift操场上的分割故障



我是新来的,我正在Swift中进行一些练习,我发现了这个问题:

当我尝试执行此代码时,我会得到一个细分故障,我不知道为什么。

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)

您基本上正在尝试使用computed property

除了存储的属性,类,结构和枚举还可以定义计算的属性,实际上并未存储一个值。相反,它们提供了一个getter和一个可选的设置器,以间接检索和设置其他属性和值。

这里的密钥是"实际上并不存储一个值" 。当您尝试使用get TER时,这也可以清晰地看到,因为print(p1.Sesso)也会导致崩溃,因为您最终会一遍又一遍地呼唤Getter的无限环路。您应该做的是定义计算属性,但同时定义了另一个存储的属性,该属性实际保存数据:

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

问题是您无法访问其自身getter和setter的变量。

相反,您可以使用 didset

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

,您可以从此答案中了解更多有关Getters和setter的信息,还可以检查Apple文档有关属性的文档以进行更多澄清。

最新更新