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

问题描述 投票:0回答:4

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

然后我遇到了这个:

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

添加

public private(set)
究竟如何工作?如果你能展示一些更简单的例子/解释,那就太棒了!

swift struct access-modifiers
4个回答
72
投票

这只是意味着

numberOfEdits
的 getter 是公开的,而 setter 是私有的。仅此而已。

这种情况的原因是你可以公开阅读

numberOfEdits
,但你只能通过改变
value
来设置它。如果完全是
public
,那么任何人都可以设置,但是如果只是可设置,那么
didSet
中的
value
就不能修改了。
private(set)
是这两者之间的妥协。


20
投票

此属性可以 read,但不能从 outside 设置。

您通过编写

private(set)
分配较低的访问级别。

它的作品像Public getterPrivate setter.

//MARK:- Foo
class Foo {
    private var name: String
    private var ID: String

   //initialize
   init(name:String, ID:String){
      self.name = name
      self.ID = ID
   }
}

尝试访问

private
变量时会出错。

但是我们可以通过将

private
访问级别更改为
private(set)
来在一行中修复此错误。

//MARK:- Foo
class Foo {
    private(set) var name: String
    private var ID: String

   //initialize
   init(name:String, ID:String) {
       self.name = name
       self.ID = ID
   }
}

因此您可以轻松访问私有变量、常量、属性或下标。

//Access class value from Foo
let fooObjc = Foo.init(name: "test", ID: "9900")
print(fooObjc.name)

使用

fileprivate(set)
private(set)
internal(set)
以与计算属性中的显式 setter 完全相同的方式更改此合成 setter 的访问级别。

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

参考:点击链接了解更多


0
投票

private (set) var
的目的是限制对内部范围的写访问,但仍然允许外部读访问。

变量在内部是可读可写的。

private (set) var
将写入访问限制为仅内部,同时允许外部读取访问。

例如:

private var
无法从外部访问

class NameNotAccessible {
    private var name: String?
}

var person = NameNotAccessible()
print(person.name) // ERROR - access level will not allow

private (set) var
允许外部读取访问,但仅限内部写入访问

class NameAccessible {
    private (set) var name: String?
}

var person2 = NameAccessible()
print(person2.name) // external access allowed
person2.name = "Jacob" // ERROR - cannot write it externally

0
投票

谢谢@Sivabalaa Jothibose 和@craft 它对我有用,非常感谢您的帮助。

此外,如果您希望此 var 公开可读(Objective-C 和 Swift)并且私下可设置,那么您可以执行以下操作:

@objc public private(set) var myVar: String = ""
© www.soinside.com 2019 - 2024. All rights reserved.