Swift 为什么要在模型中使用私有变量?

Swift 为什么要在模型中使用私有变量?,swift,encapsulation,Swift,Encapsulation,我在一个在线视频中发现了这个例子,我无法真正理解它的重要性以及幕后发生的事情: class Person { private var _name: String! var name: String { return _name } init(name: String){ _name = name } } 在视频中,他提到私有变量是为了防止类操纵数据,但我不理解为什么会出现问题,甚至不理解这是如何发生的 有人能像我5岁

我在一个在线视频中发现了这个例子,我无法真正理解它的重要性以及幕后发生的事情:

class Person {
    private var _name: String!

    var name: String {
        return  _name
    }

    init(name: String){
        _name = name
    }
}
在视频中,他提到私有变量是为了防止类操纵数据,但我不理解为什么会出现问题,甚至不理解这是如何发生的

有人能像我5岁一样给我解释一下吗


感谢您的帮助

如果要确保人名始终是有效值,则需要在代码中指定一个位置来检查写入“姓名”字段的数据。如果通过将字段的可见性更改为private来隐藏该字段,则来自类外部的代码必须使用setter方法写入name字段。您可以在setter方法中执行所有验证要求,以确保person对象中的数据始终处于有效状态

这是面向对象编程的基本原则。你可以在这个链接上阅读更多的信息

有人能像我5岁一样给我解释一下吗

好吧,我五岁的朋友,你熟悉“陌生人=危险”规则,对吗?有时,您的对象需要与陌生人交互。尽管在许多情况下,陌生人与您的对象进行交互是出于善意,但偶尔您会遇到想要伤害您的对象的人,例如,通过更改其名称:

// If name were public, anyone could do this:
somePerson._name = "nasty-boy" // Not a good name!
为了保护您的对象不被陌生人重命名,您可以通过将重要内容标记为“私有”使对象之外的任何人都无法访问它们。这使得这些重要的东西对对象之外的任何人都不可访问。然而,对象自己的方法可以自由访问私有变量,例如,将它们返回给陌生人进行读取,但不用于写入:

var name: String {
    return  _name
}

这里有一个一般性的解释:这里有更多的答案(基本上与第一个链接相同)顺便说一句,这是一个糟糕的风格-你最好使用以下语法:
private(set)var name:String
@FyodorVolchyok-同意,如果类可能会更改它,但您不希望外部类修改它,则private setter是有意义的。或者,如果您不打算在初始值设定项设置之后更改它,只需
让name:String
。这是Java代码。Swift不是Java。不要用Swift编写Java代码。另外,不要相信任何用Swift编写Java代码的人。即使任何人都是你,那么这种技术仍然是有用的,因为随着你的程序将来的发展,你可能会忘记并在不经意间更改其他地方的名称,从而引入一个不太明显的错误。