我有一个关于面向对象设计原则和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的本机技术来实现我的目标信息隐藏?
答案 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
以上是一个原始的例子,但处理严格,它作为一个良好的模式。