Swift中的私有setter set()

3pvhb19x  于 2023-10-15  发布在  Swift
关注(0)|答案(3)|浏览(146)

这是一个点的例子,介绍了apple提供的pint结构setter getter如何使setter成为private

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)
        }
    }
}
1szpjjfi

1szpjjfi1#

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

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

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

uplii1fm

uplii1fm2#

Swift私有setter

Swift access modifiers(https://stackoverflow.com/a/60905233/4770877)
解决方案#1使用公共函数

struct MyStruct {
    private var a: String
    
    init(a: String) {
        self.a = a
    }
    
    func getA() -> String {
        return a
    }
}

let myStruct = MyStruct(a: "Hello World")
let a = myStruct.getA()

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

struct MyStruct {
    private(set) var a: String

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

let myStruct = MyStruct(a: "Hello World")
let a = myStruct.a
z31licg0

z31licg03#

您可以按如下方式优化结构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()
}

相关问题