“Public Private(Set)”访问修饰符是如何工作的?

anauzrmj  于 2022-10-04  发布在  Swift
关注(0)|答案(3)|浏览(179)

所以我在这里浏览一下苹果文档-Apple Docs

然后我遇到了这样的情况:

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

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

laawzig2

laawzig21#

这仅仅意味着numberOfEdits的getter是公共的,而setter是私有的。没有比这更重要的了。

这种情况下的原因是,您可以公开读取numberOfEdits,但只能通过更改value进行设置。如果它完全是public,那么任何人都可以设置它,但如果它只是可设置的,那么value中的didSet不能修改它。private(set)是两者之间的折衷方案。

iih3973s

iih3973s2#

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

您可以通过写入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)可以更改此合成设置器的访问级别,方法与更改计算属性中显式设置器的方式完全相同。

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

编号:Click the link to know more

0lvr5msh

0lvr5msh3#

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

相关问题