2

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

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

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

//
//  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,而是直接从外部访问属性。关于为什么开发人员可能会迅速这样做的任何想法?我的方法不够“迅速”吗???

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

4

2 回答 2

3

public您可以通过将属性标记为读取和写入来限制外部属性操作,private文档中所述

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
于 2015-01-05T11:30:07.400 回答
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

上面是一个原始示例,但经过严格处理,它可以作为一个很好的模式。

于 2015-01-05T11:32:35.443 回答