警告:尝试在其自己的 getter 与 SwiftFormat 中访问 'myProperty'
Warning: Attempting to access 'myProperty' within its own getter vs SwiftFormat
我有这样的代码:
@IBInspectable var myProperty: String? {
set(newValue) {
//logic for setter
}
get {
return myProperty
}
}
以上代码生成警告:
Attempting to access 'myProperty' within its own getter. Access 'self'
explicitly to silence this warning.
所以我按照建议修改了代码:
@IBInspectable var myProperty: String? {
set(newValue) {
//logic for setter
}
get {
return self.myProperty
}
}
问题会得到解决,但我在应用程序构建阶段使用 SwiftFormat。
并且 SwiftFormat 自动删除了 self 关键字,在这里将其视为不必要的。
我看到两个解决方案:
- 关闭 SwiftFormat 中的 redundantSelf 规则。
- 修改(如何?)编译器和 SwiftFormat 都可接受的代码。
最好的选择是什么?
首先您的代码不正确。添加 self
将无济于事。
你创造的是无限递归。当 myProperty
的 getter 被调用时,您 return myProperty
再次调用 getter。在 getter 中你再次 return myProperty
并且这会再次调用 getter。这将永远持续下去,直到堆栈溢出。
如果您只想自定义 setter,可以尝试 willSet
或 didSet
。
var myProperty: String {
willSet(newValue) {
// do stuff
}
}
// or
var myProperty: String {
didSet(oldValue) {
// do stuff
}
}
我在尝试编写带有支持 ivar 的 Objective-C 样式 属性 时遇到了同样的警告:
var myProperty: String {
guard let myProperty = _myProperty else {
_myProperty = "some string"
return myProperty // Attempting to access 'myProperty' within its own getter
}
return myProperty
}
var _myProperty: String? = nil
扩展Xcode中的错误信息,但是显示警告在第二行有提示:
// Attempting to access 'myProperty' within its own getter
// Access 'self' explicitly to silence this warning
更改为 return self.myProperty
因此在调用不会导致无限递归的情况下使警告静音。
我有这样的代码:
@IBInspectable var myProperty: String? {
set(newValue) {
//logic for setter
}
get {
return myProperty
}
}
以上代码生成警告:
Attempting to access 'myProperty' within its own getter. Access 'self' explicitly to silence this warning.
所以我按照建议修改了代码:
@IBInspectable var myProperty: String? {
set(newValue) {
//logic for setter
}
get {
return self.myProperty
}
}
问题会得到解决,但我在应用程序构建阶段使用 SwiftFormat。 并且 SwiftFormat 自动删除了 self 关键字,在这里将其视为不必要的。
我看到两个解决方案:
- 关闭 SwiftFormat 中的 redundantSelf 规则。
- 修改(如何?)编译器和 SwiftFormat 都可接受的代码。
最好的选择是什么?
首先您的代码不正确。添加 self
将无济于事。
你创造的是无限递归。当 myProperty
的 getter 被调用时,您 return myProperty
再次调用 getter。在 getter 中你再次 return myProperty
并且这会再次调用 getter。这将永远持续下去,直到堆栈溢出。
如果您只想自定义 setter,可以尝试 willSet
或 didSet
。
var myProperty: String {
willSet(newValue) {
// do stuff
}
}
// or
var myProperty: String {
didSet(oldValue) {
// do stuff
}
}
我在尝试编写带有支持 ivar 的 Objective-C 样式 属性 时遇到了同样的警告:
var myProperty: String {
guard let myProperty = _myProperty else {
_myProperty = "some string"
return myProperty // Attempting to access 'myProperty' within its own getter
}
return myProperty
}
var _myProperty: String? = nil
扩展Xcode中的错误信息,但是显示警告在第二行有提示:
// Attempting to access 'myProperty' within its own getter
// Access 'self' explicitly to silence this warning
更改为 return self.myProperty
因此在调用不会导致无限递归的情况下使警告静音。