我有一个关于面向对象设计原则和 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 的原生技术是什么来实现我想要的信息隐藏?
您可以通过标记属性来限制外部属性操作public
用于阅读和private
用于写作,如上所述在文档中 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AccessControl.html:
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)