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

2023-12-28

我有一个关于面向对象设计原则和 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(使用前将#替换为@)

以“更快”的方式隐藏信息? 的相关文章

随机推荐

  • 不同列表视图项目的不同选择颜色

    我有以下要求 不同的列表视图项目有不同的颜色 颜色在代码中动态指定 仅当按下 选择列表视图项时才应显示颜色 列表视图项的颜色不应永久更改 无论出于何种原因 它似乎并不像我想象的那么简单 唯一至少朝着正确方向前进一点点的解决方案是 https
  • pyqt 和 websocket 客户端。在后台监听 websocket

    我有一个 PyQt Gui 应用程序 该应用程序有一个主窗口 应在启动后打开 该应用程序应该监听 websocket 我尝试这样解决 if name main app QtGui QApplication sys argv window W
  • 核心数据、NSNumber、整数 32 和整数 64

    在 Core Data 中 我有许多属性声明为 Integer 64 然后通过 NSNumber 属性访问 这是默认情况 我通过以下方式存储和访问这些值是否重要 NSNumber mySetValue NSNumber numberWith
  • 在打字稿中定义对象形状变体

    我试图定义一个可以包含数据或错误的对象 export type ActionResult data any error any function test ActionResult return data 3 当尝试访问函数的结果时 我得到
  • 删除JQ中嵌套对象中的字段

    我有一个 JSON 行文件summary领域和其他领域 我想使用 JQ 删除所有汇总字段 这是我的输入 object1 summary Some summary I want removing keepMe please object2 s
  • XSL-FO 的架构在哪里? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道如何 在哪里下载 XSL FO 1 1 架构 我找不到 XSL FO 1 1 模式 所以很多人
  • 如何在 SQLAlchemy 中建模“UNIQUE”约束?

    我正在编写一个 Flask SQLAlchemy 应用程序 其中有用户和组 用户可以属于多个组 并且他们在每个组中都有一个唯一的编号 询问如何对数据库进行建模 https dba stackexchange com questions 32
  • 如果您不知道 Powershell 中 JSON 对象的名称字段,如何获取它?

    我有这个 JSON 文件 CARD MODEL TITLE OWNER S MANUAL CARD MODEL SUBTITLE Configure your download CARD MODEL SELECT Select Model
  • 如何显示/隐藏(如果可能的话使用动画)LongListSelector 中的复选框

    我已经在 MSDN 上搜索了几个小时 但找不到如何在 Windows Phone 8 的列表中显示或隐藏复选框的示例 一个示例是在消息传递应用程序中 用户使用应用程序栏来按 多项选择 按钮 这允许用户选择多条消息 我发现了一些有关使用 Ex
  • 在 Visual Studio 中的包管理器控制台上更新多个包

    在 Visual Studio 中 包管理器控制台比包管理器对话框更快 这就是为什么我总是使用控制台 但是 有时我需要一次更新 2 3 个软件包 比如说模型 存储库项目 有没有命令可以一次指定这2 3个包 这样我就不用一一打字等待了 顺便说
  • PatternTest 未优化?

    在准备回应时Mathematica 中 PatternTest 的意外行为 https stackoverflow com q 8468072 618728我遇到了意想不到的事情数学我自己的行为 请考虑 test Print False M
  • Eclipse Xdebug 冻结在 57%

    我的问题 当从 Eclipse 为我的一个 php 页面启动调试配置时 该页面在 Chrome 中成功打开 但 Eclipse 调试器冻结在 57 位于 Eclipse 的右下角 并且永远不会进一步前进 永远不会达到设定的断点 我的设置 M
  • 在 swift 中打印而不换行

    在斯威夫特2 0中 print 自动添加换行符 在斯威夫特 1 2 中 println and print 曾经是单独的功能 那么我如何打印一些文本而不添加换行符 因为 swift 不再具有不附加换行符的打印功能 从 Swift 2 0 开
  • 确定汽车和非汽车模式之间最多 1 小时的时差

    I have household person time mode 1 1 07 45 00 non car 1 1 09 05 00 car 1 2 08 10 00 non car 1 3 22 45 00 non car 1 4 08
  • 无法使用 Ghost4J 加载库“gs”

    我正在尝试使用 Ghost4J 将 PDF 转换为 PNG 我知道人们以前曾问过这个问题 但在 OS X 10 和最新版本的 Ghost4J 中却没有 我已按照 zippy1978 的答案中列出的说明进行操作 使用 Java 将 PDF 转
  • WM_TOUCH 不会立即随触摸事件一起发送

    我正在使用触摸屏并使用 Windows 7 内置驱动程序 因为它从未提示我安装任何驱动程序 除了一个小问题外 它工作正常 当我触摸屏幕时 它不会发送 WM LBUTTONDOWN 直到我将手指移离屏幕 这样做似乎是为了确定我是否打算按住模拟
  • setlocale() 无法在 MacOS 上使用 MAMP 在本地主机上工作

    简而言之我的问题 我正在使用setlocale LC TIME de DE 为了用德语显示日期 时间的 口头 部分 即月份 工作日 这适用于任何公共服务器 但是doesn t在我的本地主机上 使用 MAMP 它以英语而不是德语显示它 详细地
  • 为 Mac App Store 创建基于 HTML5 的应用程序

    Mac 版的新 Tweetdeck 据说是基于 HTML5 的 http www cultofmac com 134237 tweetdeck releases html5 based app in the mac app store ht
  • Networked-aframe 为新用户分配不同的位置

    我在使用 networked aframe 设置的多人 A Frame 环境中遇到问题 我希望连接的前三个用户有不同的生成位置 并且任何其他用户在第三个位置生成 但我无法让它工作 这是我到目前为止在 Html 中所拥有的内容
  • 以“更快”的方式隐藏信息?

    我有一个关于面向对象设计原则和 Swift 的问题 我对 Java 非常熟悉 目前正在学习 udacity 课程 以便初步掌握 Swift 在 Java 社区 基本上在每个遵循 OOP 的社区 中 使用信息隐藏技术 例如将数据隐藏或封装在类