代码之家  ›  专栏  ›  技术社区  ›  Ahmad F

是否有方法将协议属性声明为私有?

  •  5
  • Ahmad F  · 技术社区  · 6 年前

    我希望遵守一个协议,并隐藏其要访问的符合属性(声明为 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 .

    我怎样才能防止 价值 通过说 myObject.value ?如果没有办法,限制的原因是什么?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Martin R    6 年前

    符合

    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