使用getter和setter在Swift中修改值而不进行子类化
假设我有一个类,当我设置它的属性时,我希望它用类似使用getter和setter在Swift中修改值而不进行子类化,swift,Swift,假设我有一个类,当我设置它的属性时,我希望它用类似.fileType的文件类型附加该属性: class File { var fileName: String { get { return self.fileName } set { self.fileName = fileName + ".fileType" } } } 我试着这样使用: let newFile = File() newFile
.fileType
的文件类型附加该属性:
class File {
var fileName: String {
get {
return self.fileName
}
set {
self.fileName = fileName + ".fileType"
}
}
}
我试着这样使用:
let newFile = File()
newFile.fileName = "My File"
set {
self.theFileName = newValue + ".fileType"
}
不幸的是,变量从未设置:
我有两个可能的解决办法
选项1:设置后观察值
但是有了这个,我必须等到值已经设置好之后才能修改它。对于这个特殊的例子,它没有太大的区别;然而,我希望能够避免这种情况
选项2:子类
此解决方案基于“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中修改属性?如果使用
set
和get
则必须计算属性。它没有实际的存储空间
此代码定义一个var
来保存数据,并定义一个计算的var
来处理访问。这与Objective-C中的类似(不同之处在于,在Objective-C中,您可以通过将实际变量设置为私有变量来“隐藏”它,或者,最近,将其合成为标题中从未提及的变量)
您也可以这样编写集合
:
let newFile = File()
newFile.fileName = "My File"
set {
self.theFileName = newValue + ".fileType"
}
其中,如果省略set
的参数声明,则newValue
是默认名称
但你可能想做的是你已经做过的(并且因为未知的原因被拒绝):
这是正确的方法
请注意,“我必须等到值已经设置好后才能修改它。”不是真的。看起来是这样的,但编译器可以很好地优化代码(而且可能会)。为什么
didSet
中的设置不是递归的?@moby,因为didSet观察器就是这样在后台实现的。请参阅(特别是“全局和局部变量”部分前面的注释)。
var fileName: String = "" {
didSet {
self.fileName += ".fileType"
}
}