有没有一种方法可以将协议属性声明为私有?

时间:2018-07-12 12:36:23

标签: swift protocols access-control

我要遵守协议,并隐藏要访问的一致属性(将其声明为private)。

请考虑以下内容:

protocol P {
    var value: String { get }

    init(value: String)
}

class C: P {
    var value: String

    required init(value: String) {
        self.value = value
    }
}

我将创建一个C对象:

let myObject = C(value: "Hello World")
myObject.value = "New Value"

基于此,我有两个问题:

现在,如果我尝试将value声明为私有:

private var value: String { get }

编译器将抛出错误:

  

“专用”修饰符不能在协议中使用

提出了将private替换为internal的修复建议。

如何通过说value来阻止myObject.value的访问?如果没有办法,此限制的原因是什么?

1 个答案:

答案 0 :(得分:2)

符合

protocol P {
    var value: String { get }

    init(value: String)
}

需要具有默认访问权限的gettable属性value。如果写访问 符合类别的属性应仅限于类别本身 那么您可以在Swift readonly external, readwrite internal property中声明它:

class C: P {
    private(set) var value: String

    required init(value: String) {
        self.value = value
    }
}

let myObject = C(value: "Hello World")
print(myObject.value) // OK
myObject.value = "New Value" // Error: Cannot assign to property: 'value' setter is inaccessible

如果该属性仅应在初始化程序中设置,则进行设置 常量:

class C: P {
    let value: String

    required init(value: String) {
        self.value = value
    }
}

let myObject = C(value: "Hello World")
print(myObject.value) // OK
myObject.value = "New Value" // Error: Cannot assign to property: 'value' is a 'let' constant