首先,我有一个仅定义一些只读属性的协议,例如:
protocol Example {
var var1:String { get }
var varArray:[String] { get }
}
然后我想创建一个符合该协议的结构。我遇到的问题是我有两个相互冲突的要求:
- 属性需要延迟生成。
- 属性是相关的,需要一起生成。
我似乎找不到办法做到这一点。我最接近的是这样的:
struct AStruct : Example {
private lazy var data:(var1:String, varArray:[String]) = {
var stringValue:String = ""
var stringArray:[String] = []
//Generate data
return (stringValue, stringArray)
}()
var var1:String {
return self.data.var1
}
var varArray:[String] {
return self.data.varArray
}
}
问题是,我收到错误:Immutable value of type 'AStruct' only has mutating members named 'data'
.
有谁知道我可以实现目标的方法吗?从技术上讲,data
变量是可变的,但永远不会改变。我不能使用let
with lazy
所以我不能指定该值一旦生成就永远不会改变。不过,我需要生成这些值,因为该结构是在主线程上创建的,但这些值将由另一个进程在后台线程上生成。
Update
所以有人向我指出我可以制作吸气剂mutating
在协议和结构中。这是可行的,但我现在遇到的问题是我无法在任何其他结构(我就是)中使用这个结构。所以最后,我把问题推到了另一个结构中,我不希望它是可变的。
Ex:
struct Container {
let astruct:AStruct
let callback:() -> ()
}
我无法访问其中的变量AStruct
from Container
因为Container
是不可变的,并且成员变量AStruct
正在变异。尝试访问它们会给出与我之前提到的相同的错误消息。
更改要使用的容器var
代替let
产生相同的错误:
struct Container {
var astruct:AStruct
let callback:() -> ()
}
如果我在处理类中设置一个函数来接收Container
处理:
func processContainer(cont:Container){
self.doSomething(cont.astruct.var1)
}
我犯了同样的错误:Immutable value of type 'AStruct' only has mutating members names 'sql'
.