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

Ahm*_*d F 5 protocols access-control swift

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

考虑以下:

protocol P {
    var value: String { get }

    init(value: String)
}

class C: P {
    var value: String

    required init(value: String) {
        self.value = value
    }
}
Run Code Online (Sandbox Code Playgroud)

我将创建一个C对象:

let myObject = C(value: "Hello World")
myObject.value = "New Value"
Run Code Online (Sandbox Code Playgroud)

基于此,我有两个问题:

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

private var value: String { get }
Run Code Online (Sandbox Code Playgroud)

编译器将抛出错误:

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

与修复建议,以取代privateinternal

我该如何防止value通过说出来进行访问myObject.value?如果没有办法,限制的原因是什么?

Mar*_*n R 7

符合

protocol P {
    var value: String { get }

    init(value: String)
}
Run Code Online (Sandbox Code Playgroud)

需要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
Run Code Online (Sandbox Code Playgroud)

如果该属性只应在初始值设定项中设置,则将其设为常量:

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
Run Code Online (Sandbox Code Playgroud)