【问题标题】:Private setter "set()" in SwiftSwift 中的私有设置器“set()”
【发布时间】:2016-03-22 07:12:33
【问题描述】:

这是 apple 提供的 pint 结构 setter getter 的示例介绍如何使只有 setter 私有

struct Point {
    var x = 0.0, y = 0.0
}
struct Size {
    var width = 0.0, height = 0.0
}
struct Rect {
    var origin = Point()
    var size = Size()
    var center: Point {
        get {
            let centerX = origin.x + (size.width / 2)
            let centerY = origin.y + (size.height / 2)
            return Point(x: centerX, y: centerY)
        }
        set(newCenter) {
            origin.x = newCenter.x - (size.width / 2)
            origin.y = newCenter.y - (size.height / 2)
        }
    }
}

【问题讨论】:

  • 你想能得到中心但不直接设置吗?是这样吗?
  • 是的,你是对的
  • 好的,我没有删除我的答案,认为它可能适合你想要的。使用private (set) 的另一个答案也可能有效,但正如所表明的那样,它的工作方式与您想象的不同。由于您不希望能够设置中心属性,因此最好的方法是使用中心的计算属性。希望这会有所帮助

标签: swift


【解决方案1】:

docs 中,在标题“Getters and Setters”下的第一个代码示例中,您可以看到要拥有私有 setter,语法如下所示:

private (set) var center: Point {...

一些澄清: private 在 Swift 中的工作方式略有不同——它将对属性/方法的访问限制在文件的范围内。只要文件中有一个以上的类,他们就可以访问其所有内容。为了让private“工作”,您需要将您的类放在单独的文件中。

【讨论】:

  • 这在 Playground 和实际项目中都不会产生任何警告。我可以将Point 设置为center 属性。
  • Private 在 Swift 中的工作方式有点“不同”——它将属性/方法的使用限制在 file 的范围内。因此,在 Playground 中,您无法获得真正的私有财产(至少我不知道如何)。在实际项目中,您应该将类​​保存在单独的文件中 - 只要您在一个文件中有两个类,它们就可以访问它们的所有属性/方法。
  • 谢谢,我就是这么想的。
  • 从 Swift 3 开始,fileprivate 用于限制对文件本身的可访问性。 private 是班级私有的。
【解决方案2】:

使用公共函数的解决方案 #1

struct A {

    private var a: String

    public init(a: String) {
        self.a = a
    }

    func getA() -> String {
        return a
    }
}

let field = A(a:"a")
field.getA()

使用私有设置器的解决方案 #2。在这种情况下,setter 的访问级别比 geter 低

struct A {

    private(set) var a: String

    public init(a: String) {
        self.a = a
    }
}

let field = A(a:"a")
field.a

【讨论】:

  • 解释得很好!谢谢
【解决方案3】:

您可以按如下方式细化结构 Rect。这将允许您只获取中心但不设置它。

struct Rect {

    var center:Point {
        let centerX = origin.x + (size.width / 2)
        let centerY = origin.y + (size.height / 2)
        return Point(x: centerX, y: centerY)
    }

    var origin = Point()
    var size = Size()
}

【讨论】:

    猜你喜欢
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 2013-06-25
    • 2013-06-19
    • 1970-01-01
    相关资源
    最近更新 更多