"public private(set)"访问修饰符如何工作?

brk*_*rkr 11 swift

所以我在这里浏览Apple文档 - Apple Docs

然后我遇到了这个..

public struct TrackedString {
    public private(set) var numberOfEdits = 0
    public var value: String = "" {
        didSet {
            numberOfEdits += 1
        }
    }
    public init() {}
}
Run Code Online (Sandbox Code Playgroud)

如何public private(set)正确添加工作?如果你能展示一些比较神奇的更简单的例子/解释!

Rob*_*ier 12

这只是意味着getter numberOfEdits是公共的,但是setter是私有的.没有更多的东西.

在这种情况下的原因是您可以numberOfEdits公开阅读,但您只能通过更改来设置它value.如果它是完全的public,那么任何人都可以设置它,但如果它只是可设置的,则didSetin value无法修改它.private(set)是这两者之间的妥协.

  • @conarch"numberOfEdits属性是只能在类中设置的属性"不是类.文件.Swift中尚未实现隐私类别范围. (3认同)

Siv*_*ose 6

此属性可以读取,但不能从外部设置

参考:点击链接了解更多

  • 在你的最后一个例子中,“private(set) var”实际上是“let”。– `private(set) var` 仅当要在类内部修改值时才有用(`init` 方法不算在内)。 (2认同)

cra*_*aft 5

private (set) var限制对内部范围的写访问,但仍然允许外部读访问。var 也可以在内部读取。

例如,private var比较private (set) var

private

class NameNotAccessible {
    private var name: String?
}

var person = NameNotAccessible()
print(person.name) // ERROR: external access forbidden
Run Code Online (Sandbox Code Playgroud)

修改为private (set) var

class NameAccessible {
    private (set) var name: String? // externally readable, internally writable
}

var person2 = NameAccessible()
print(person2.name) // external read OK
person2.name = "Jacob" // ERROR: external write forbidden
Run Code Online (Sandbox Code Playgroud)