信息隐藏"Swifter"的方式?
Information Hiding the "Swifter" way?
我有一个关于面向对象设计原则和 Swift 的问题。我对 Java 非常熟悉,目前我正在参加一个大胆的课程,以便在 Swift 中获得第一手经验。
在 Java 社区中(基本上在每个遵循 OOP 的社区中)使用信息隐藏技术非常普遍,例如在 classes 中隐藏或封装数据以确保它不会被泄露从外面操纵。一个常见的原则是将 class 的所有属性声明为私有的,并使用 getter 来检索属性的值,并使用 setter 进行操作。
我在编写作为课程一部分的 class 时尝试遵循这种方法,它看起来像这样:
//
// 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"
}
}
}
代码有效,无法从 class 外部访问我的私有属性,这正是我想要实现的行为。但是,我想到了以下问题:
1.) 课程讲师决定将属性的访问控制级别保留为默认 "internal",而不使用 getters/setters,而是直接从外部访问属性。关于为什么开发人员可能会迅速这样做的任何想法?我的方法还不够"swift"吗???
2.) 结论:在自己写class的时候有没有"swifter"实现封装的方法?什么是 swift 的原生技术来实现我想要的信息隐藏?
您可以限制外部 属性 操作,方法是将 属性 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
我做的有点像 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
以上是一个原始示例,但经过严格处理后它可以作为一个很好的模式。
我有一个关于面向对象设计原则和 Swift 的问题。我对 Java 非常熟悉,目前我正在参加一个大胆的课程,以便在 Swift 中获得第一手经验。
在 Java 社区中(基本上在每个遵循 OOP 的社区中)使用信息隐藏技术非常普遍,例如在 classes 中隐藏或封装数据以确保它不会被泄露从外面操纵。一个常见的原则是将 class 的所有属性声明为私有的,并使用 getter 来检索属性的值,并使用 setter 进行操作。
我在编写作为课程一部分的 class 时尝试遵循这种方法,它看起来像这样:
//
// 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"
}
}
}
代码有效,无法从 class 外部访问我的私有属性,这正是我想要实现的行为。但是,我想到了以下问题:
1.) 课程讲师决定将属性的访问控制级别保留为默认 "internal",而不使用 getters/setters,而是直接从外部访问属性。关于为什么开发人员可能会迅速这样做的任何想法?我的方法还不够"swift"吗???
2.) 结论:在自己写class的时候有没有"swifter"实现封装的方法?什么是 swift 的原生技术来实现我想要的信息隐藏?
您可以限制外部 属性 操作,方法是将 属性 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
我做的有点像 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
以上是一个原始示例,但经过严格处理后它可以作为一个很好的模式。