【问题标题】:Why declare readonly property in protocol?为什么要在协议中声明只读属性?
【发布时间】:2015-11-21 22:26:49
【问题描述】:

如果我们可以通过类或结构设置值,为什么还要在协议中声明只读属性?我无法理解这个的用法。 在《The Swift Programming Book》2.0版中

“如果协议只要求某个属性是可获取的,那么任何类型的属性都可以满足该要求,并且如果这对您自己的代码有用,那么该属性也可设置是有效的。”

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    所以它不能从类/结构之外设置。想象一下,您的 API 返回了具有 get 和 set 属性(在您的协议中)的协议实例,那么任何获得此实例的人都可以设置该值!

    还有get和set属性不能是常量:

    protocol RWProt {
        var value : Int { get set }
    }
    
    // Error: Type 'Value' does not conform to protocol 'RWProt'
    struct Value : RWProt {
        let value = 0
    }
    

    但是这有效:

    protocol Read {
        var value : Int { get }
    }
    
    struct Value : Read {
        var value = 0
    
        mutating func change() {
            value++
        }
    }
    

    协议只需要值是可get的,所以getprotocols属性不是get only而是get或set

    好的,这是另一个例子:

    import Foundation
    
    public protocol ExternalInterface {
        var value : Int { get }
    }
    
    
    private struct PrivateStuff : ExternalInterface {
        var value = 0
    
        mutating func doSomePrivateChangingStuff() {
            value = Int(arc4random())
        }
    }
    
    
    
    public func getInterfaceToPrivateStuff() -> ExternalInterface {
        var stuff = PrivateStuff()
        stuff.doSomePrivateChangingStuff()
        return stuff
    }
    
    
    
    
    // In another file:
    
    let interfaceToSomethingICantChange = getInterfaceToPrivateStuff()
    
    // error: cannot assign to property: 'value' is a get-only property
    interfaceToSomethingICantChange.value = 0
    

    【讨论】:

    • 但是我可以通过类实例设置值(实现该协议)。
    • @TigranTorgomyan 编辑了我的答案
    • 但为什么有可能呢?目的是什么?
    • @TigranTorgomyan 再次编辑,对用例进行映像真的不难
    • 谢谢。最后一个例子说明一切。
    猜你喜欢
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    相关资源
    最近更新 更多