为什么在协议中声明readonly属性?

时间:2015-08-27 13:43:22

标签: ios swift

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

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

1 个答案:

答案 0 :(得分:3)

因此它不能从类/结构外部设置。想象一下,你的API返回了一个具有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++
    }
}

协议只需要值可获取,因此获取协议属性不仅仅是获取或设置

好的,这是另一个例子:

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