swift - 在 Swift 中使用 Getters 和 Setters 修改不带子类化的值

标签 swift

假设我有一个类,当我设置它的属性时,我希望它为该属性附加一个类似 .fileType 的文件类型:

class File {
    var fileName: String {
    get {
        return self.fileName
    }
    set {
        self.fileName = fileName + ".fileType"
    }
    }
}

我尝试这样使用:

let newFile = File()
newFile.fileName = "My File"

不幸的是,变量永远不会设置:

Checkpoints

我有两种可能的解决方法。

选项 1:设置后观察值

class File {
    var fileName: String = "" {
    didSet {
        self.fileName += ".fileType"
    }
    }
}

let file = File()
file.fileName = "SomeName" // SomeName.fileType

但是有了这个,我必须等到值已经设置好才能修改它。对于这个特定的例子,它并没有太大的区别;但是,我希望能够避免这种情况。

选项 2:子类

此解决方案基于示例 here.搜索“speedLimitedCar”

class File {
    var fileName = ""
}

class SubFile: File {

    override var fileName: String {
    get {
        return super.fileName
    }
    set {
        super.fileName = newValue + ".fileType"
    }
    }
}

let subfile = SubFile()
subfile.fileName = "Hello" // Hello.fileType

问题

我也可以只创建一个辅助属性来存储值并在文件名的 getter/setter 中访问它,但是有没有办法避免所有这些并直接在其 getter/setter 中修改属性?

最佳答案

如果您使用setget,则必须计算该属性。它没有实际的存储空间。

此代码定义了一个 var 来保存数据,并定义了一个计算的 var 来处理访问。这类似于您在 Objective-C 中的情况(除了在 Objective-C 中您可以通过将其设为私有(private)或最近将其合成为 header 中从未提及的变量来“隐藏”实际变量)。

class File {
    // this stores the actual data, do not access it directly, consider it private
    var theFileName: String = ""

    // this is the real interface
    var fileName: String {
        get {
            return self.theFileName
        }
        set(name) {
            self.theFileName = name + ".fileType"
        }
    }
}

你也可以这样写set:

set {
    self.theFileName = newValue + ".fileType"
}

如果省略 set 的参数声明,其中 newValue 是默认名称。

但您可能想做的是您已经做过的(并因未知原因被拒绝):

var fileName: String = "" {
    didSet {
        self.fileName += ".fileType"
    }
}

这是正确的做法。

请注意“我必须等到值已经设置好才能修改它。”不是真的。它看起来是那样的,但是编译器可以很好地优化代码(并且可能会)。

关于swift - 在 Swift 中使用 Getters 和 Setters 修改不带子类化的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24052321/

相关文章:

ios - Swift4 tableview 单元格高度不是动态的并且始终是静态的

具有隐式解包可选的 Swift 一元运算符

swift - 如何制作一个 NSPredicate 来正确过滤本地字符?

ios - 在 Web View 中点击应用程序 url 方案后如何返回应用程序

ios - 将图像从 tableViewcell 传递到另一个 ViewController(Xib 文件)

ios - 我不知道如何激活这个功能

ios - 如何对 UIPageViewController 处理的页面内的容器进行动画处理,并且该动画与页面滑动(页面更改)相关?

swift - 基于另一个过滤数组

ios - 在更改单元格上重置 UICollectionView

ios - 如何在 UIScrollView 中获取内容 View 以使用自动布局填充父级