信息隐藏“更快”的方式?

时间:2015-01-05 10:54:42

标签: oop swift information-hiding

我有一个关于面向对象设计原则和Swift的问题。我对Java非常熟悉,我目前正在学习Udacity课程,以便在Swift中获得第一手资格。

在Java社区中(基本上在每个遵循OOP的社区中),使用信息隐藏技术(例如在类中隐藏或封装数据)以确保不能从外部操作它是很常见的。一个常见的原则是将类的所有属性声明为私有,并使用getter来检索属性的值和setters以进行操作。

我在编写课程的一部分时尝试遵循这种方法,它看起来像这样:

//
//  RecordedAudio.swift
//  Pitch Perfect
//

import Foundation

class RecordedAudio: NSObject {
    private let filePathUrl: NSURL!
    private let title: String?

    init(filePathUrl: NSURL, title: String?)
    {
        self.filePathUrl = filePathUrl
        self.title = title
    }

    func getFilePathUrl() -> NSURL
    {
        return filePathUrl
    }

    func getTitle() -> String
    {
        if title != nil
        {
            return title!
        }
        else
        {
            return "none"
        }
    }
}

代码有效,我的私有属性无法从我的课外访问,这正是我想要实现的行为。但是,我想到了以下问题:

1。)课程讲师决定将属性的访问控制级别保留为默认的“内部”,而不是使用getter / setter,而是直接从外部访问属性。关于为什么开发人员可以在swift中这样做的任何想法?我的方法不够“迅速”吗?

2。)总之:在编写自己的类时,是否有一种“更快捷”的方式来实现封装?什么是swift的本机技术来实现我的目标信息隐藏?

2 个答案:

答案 0 :(得分:3)

您可以通过标记属性public进行阅读并private进行书写来限制外部属性操作,如in the documentation所述:

class RecordedAudio: NSObject {

    public private(set) let filePathUrl: NSURL!
    public private(set) let title: String?

    init(filePathUrl: NSURL, title: String?) {
        self.filePathUrl = filePathUrl
        self.title = title
    }

}

// in another file

let audio = RecordedAudio(filePathUrl: myUrl, title: myTitle)

let url = audio.filePathUrl // works, returns the url
audio.filePathUrl = newUrl // doesn't compile

答案 1 :(得分:2)

我在Obj-C中做得有点像:

class MyClass
  private var _something:Int
  var something:Int {
    get {return _something}
// optional: set { _something = newValue }
  }
  init() { _something = 99 }
}

...
let c = MyClass()
let v = c.something

以上是一个原始的例子,但处理严格,它作为一个良好的模式。