Swift中的私人二手"set()"

Gri*_*yan 6 swift

这是点示例介绍由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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Los*_*aty 17

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

private (set) var center: Point {...
Run Code Online (Sandbox Code Playgroud)

一些澄清: private在Swift中工作方式略有不同 - 它将对属性/方法的访问限制在文件范围内.只要文件中有多个类,他们就能访问所有内容.为了private"工作",您需要将您的classess放在单独的文件中.

  • 从Swift 3开始,`fileprivate`用于限制文件本身的可访问性.`private`是班级私有的. (8认同)
  • `Private`在Swift中有点"不同" - 它将属性/方法的用法限制在*file*的范围内.所以在Playground你无法获得真正的私人财产(至少我不知道如何).在实际项目中,您应该将类​​保存在单独的文件中 - 只要在一个文件中有两个类,就可以访问它们的所有属性/方法. (5认同)
  • 谢谢,这正是我的想法。 (2认同)

yoA*_*ex5 13

Swift 私人二传手

[快速访问修饰符]

解决方案#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()  
Run Code Online (Sandbox Code Playgroud)

解决方案 #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 
Run Code Online (Sandbox Code Playgroud)


Pra*_*p K 3

您可以按如下方式细化 struct 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()
}
Run Code Online (Sandbox Code Playgroud)