swift - 有没有办法将协议(protocol)属性声明为私有(private)?

标签 swift protocols access-control

我想遵循一个协议(protocol),并隐藏其符合的属性以供访问(将它们声明为 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"

基于此,我有 2 个问题:

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

private var value: String { get }

编译器会抛出一个错误:

'private' modifier cannot be used in protocols

带有将 private 替换为 internal 的修复建议。

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

最佳答案

符合

protocol P {
    var value: String { get }

    init(value: String)
}

需要具有默认访问权限的可获取属性 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

关于swift - 有没有办法将协议(protocol)属性声明为私有(private)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51305873/

相关文章:

ios - 停止 UI 警报 Controller 返回到上一个 View

ios - 使用委托(delegate)/协议(protocol)将数据传递给第三方 View Controller

spring-security - Spring 安全: Unable to locate a matching ACE for passed permissions and SIDs

java - j2ee web 应用程序中的用户访问管理

Swift 检查对象数组的动态类型

ios - 自定义View悬浮状态

swift - 点播资源: Download request could not be completed

git - 用于推送的 Git native 协议(protocol)或 SSH 协议(protocol)之间的区别

javascript - JavaScript <href> 链接的返回值应该如何处理?

security - Symfony2 安全.yml