在使用結構代替類來實現更多的面向協議的編程方法時,我遇到了一些訪問控制難題。協議擴展:不能分配給只能得到的屬性
我正在通過網絡接收不同的消息類型,它們的原始形式只是一個字節數組。
所以我從一個協議開始。 注意如何rawBytes
被標記僅作爲{ get }
使呼叫者不能直接操縱原始字節:
protocol NetworkDataRequest {
var rawBytes: [UInt8] { get }
}
我想是線程安全的,並使用所有的值類型,協議面向善良Swift,所以我現在使用結構而不是類來創建不同的消息類型,並採用協議。
struct FileRequest: NetworkDataRequest {
private(set) var rawBytes: [UInt8]
}
struct ConnectionRequest: NetworkDataRequest {
private(set) var rawBytes: [UInt8]
}
所有不同的消息類型共享一個類似的結構的頭10個字節,例如:
- 字節[0] = permissionsByte
- 字節[1] = connectionTypeByte
- 等...
由於我使用結構我沒有繼承。但是我仍然需要一些方法來在消息類型之間有類似的行爲。 OK,所以我使用協議擴展:
extension NetworkDataRequest {
var permissionsByte: UInt8 {
get { return bytes[0] }
set { bytes[0] = newValue } //<-- Nope!
}
}
但是哎呀! rawBytes
是無法訪問:
Cannot assign through subscript: 'rawBytes' is a get-only property
有沒有辦法解決這個問題?否則,所有的結構都將有大量的樣板代碼(吮吸我),否則我將不得不開拓rawBytes(非常糟糕)
struct FileRequest: NetworkDataRequest {
private(set) var rawBytes: [UInt8]
var permissionsByte: UInt8 {
get { return bytes[0] }
set { bytes[0] = newValue }
}
var connectionTypeByte: UInt8 {
get { return bytes[1] }
set { bytes[1] = newValue }
}
///etc...
}
'它們的原始形式只是一個字節數組.'不,它們不是,它們是數據。使用'數據'。 – Alexander