gpt4 book ai didi

oop - 信息隐藏 "Swifter"方式?

转载 作者:可可西里 更新时间:2023-11-01 00:38:00 26 4
gpt4 key购买 nike

我有一个关于面向对象设计原则和 Swift 的问题。我对 Java 非常熟悉,目前我正在参加一个大胆的类(class),以亲 body 验 Swift。

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

我在编写属于类(class)一部分的类(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"
}
}
}

代码有效,我的私有(private)属性无法从我的类外部访问,这正是我想要实现的行为。但是,我想到了以下问题:

1.) 类(class)讲师决定将属性的访问控制级别保留为默认的“内部”并且不使用 getter/setter 而是直接从外部访问属性。关于为什么开发人员可能会 swift 这样做的任何想法?是我的方法不够“swift ”吗???

2.) 结论:在编写自己的类时是否有一种“更快捷”的方法来实现封装?实现我想要的信息隐藏的 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

关于oop - 信息隐藏 "Swifter"方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27778045/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com