假设我有一个类,当我设置它的属性时,我希望它附加一个文件类型的属性.fileType:
class File {
var fileName: String {
get {
return self.fileName
}
set {
self.fileName = fileName + ".fileType"
}
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用这样的:
let newFile = File()
newFile.fileName = "My File"
Run Code Online (Sandbox Code Playgroud)
不幸的是,变量从未设置:

我有两种可能的解决方法.
class File {
var fileName: String = "" {
didSet {
self.fileName += ".fileType"
}
}
}
let file = File()
file.fileName = "SomeName" // SomeName.fileType
Run Code Online (Sandbox Code Playgroud)
但是有了这个,我必须等到这个值已经设置好才能修改它.对于这个特殊的例子,它并没有太大的区别; 但是,我希望能够避免这种情况.
此解决方案基于此处的示例. 搜索'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
Run Code Online (Sandbox Code Playgroud)
我还可以创建一个辅助属性来存储值并在fileName的getter/setter中访问它,但有没有办法避免所有这些并直接在其getter/setter中修改属性?
Ana*_*ile 11
如果你使用set和get随后的属性必须被计算.它没有实际的存储空间.
此代码定义了一个var用于保存数据和一个var用于处理访问的计算器.这类似于你在Objective-C中所拥有的(除了在Objective-C中你可以通过将它变为私有来"隐藏"实际变量,或者最近,将它合成为标题中从未提及过的变量).
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"
}
}
}
Run Code Online (Sandbox Code Playgroud)
你也可以这样写set:
set {
self.theFileName = newValue + ".fileType"
}
Run Code Online (Sandbox Code Playgroud)
newValue如果省略参数声明,则默认名称在哪里set.
但你可能想要做的就是你已经做过的事情(并且由于不明原因被拒绝):
var fileName: String = "" {
didSet {
self.fileName += ".fileType"
}
}
Run Code Online (Sandbox Code Playgroud)
这是正确的方法.
请注意"我必须等到该值已经设置才能修改它." 不是真的.它看起来像这样,但编译器可以很好地优化代码(可能会).
| 归档时间: |
|
| 查看次数: |
9588 次 |
| 最近记录: |