簡體   English   中英

為什么在協議中聲明只讀屬性?

[英]Why declare readonly property in protocol?

如果可以設置值槽類或結構,為什么還要在協議中聲明只讀屬性? 我不明白這個用法。 在“ The Swift Programming Book” 2.0版中

“如果協議僅要求一個屬性是可獲取的,則該要求可以由任何種類的屬性來滿足,並且如果該屬性對您自己的代碼有用,那么也可以對該屬性進行設置是有效的。”

這樣就不能從類/結構外部進行設置。 假設您的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++
    }
}

協議只需要該值是可獲取的,因此獲取協議屬性不僅是獲取,而是獲取或設置

好的,這是另一個示例:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM