ios - Swift 中的数据封装和安全性

标签 ios swift swift3 encapsulation

我目前正在研究 Swift 中的 iOS 开发,并遇到了数据封装和安全性的概念。让我们从一个例子开始:

Class Person {
    private var _weight: Int!

    var weight: Int {
        get {
            return _weight
        }
        set {
            _weight = newValue
        }
    }
}

在教程中,我被教导为了安全起见总是创建一个私有(private)变量,这样变量就不会在外部被过度使用并改变数据。而且导师还强调要像上面那样显式设置getter和setter。编写 getter 和 setter 对我来说似乎很麻烦,似乎我只需要在需要时使用 getter 和 setter。 (即 getter 可用于只读属性,setter 可用于计算属性)。

我想知道我是否需要一直遵循这种做法,或者我是否可以像下面这样简单地定义属性:

Class Person {
    var _weight: Int!
}

最佳答案

在 Swift 中,您不需要为所有属性显式声明 getter 和 setter,除非您想自定义它们的行为。

大多数时候,这会工作得很好:

class Person {
    var weight: Int
}

您甚至可以将变量设置为公开只读,私有(private)读写:

class Person {
    public private(set) var weight: Int
}

当您想要自定义 getter 和 setter 的行为时,您的讲师的示例很有用,例如从某些外部源延迟获取数据:

class Person {
    private var _weight: Int!

    var weight: Int {
        get {
            if _weight == nil {
                //fetch _weight from somewhere
            }
            return _weight!
        }
        set {
            _weight = newValue
        }
    }
}

Private variables are not a security feature .转储对象的内存并从中提取私有(private)变量是微不足道的,在许多语言中,您可以使用反射等功能更轻松地访问它们。

相反,私有(private)变量是为了封装。标记为 private 的变量意味着“这是一个内部接口(interface),所以不要使用它。如果你使用它,它不能保证工作,即使它现在工作,将来可能行不通。”私有(private)变量还可以让编译器在某些情况下执行一些额外的优化,因为它知道除了在此类声明中之外的任何地方都不会访问该变量。

关于ios - Swift 中的数据封装和安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44442941/

相关文章:

ios - 使用 Segue 传递整数

ios - Pubnub 客户端服务器聊天 (iOS)

swift - 为什么我可以使用继承协议(protocol)的结构来设置协议(protocol)的只读属性?

ios - 无法通过 AppDelegate 的标识符调用 Segue

ios - becomeFirstResponder 不在 swift 3 中显示键盘

watchkit - WCSessionDelegate : sessionDidBecomeInactive and sessionDidDeactivate have been marked unavailable, 但必需

android - 为具有特定要求的平板电脑制作应用程序

ios - UICollectionReusableView 标题中的 UIButtons

ios - UIButton反转并发问题

swift - Cocos2d,通过回调快速查找Spritebuilder时间轴动画何时完成