Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用getter和setter在Swift中修改值而不进行子类化_Swift - Fatal编程技术网

使用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"
    }
}