警告:尝试在其自己的 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 关键字,在这里将其视为不必要的。

我看到两个解决方案:

  1. 关闭 SwiftFormat 中的 redundantSelf 规则。
  2. 修改(如何?)编译器和 SwiftFormat 都可接受的代码。

最好的选择是什么?

首先您的代码不正确。添加 self 将无济于事。

你创造的是无限递归。当 myProperty 的 getter 被调用时,您 return myProperty 再次调用 getter。在 getter 中你再次 return myProperty 并且这会再次调用 getter。这将永远持续下去,直到堆栈溢出。

如果您只想自定义 setter,可以尝试 willSetdidSet

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 因此在调用不会导致无限递归的情况下使警告静音。