我有一个变量
var soketTasksList:Set<SocketTask> {
get { return socketManager.tasksList }
}
我不需要设置,只需要得到,但我需要做这样的事情
soketTasksList.remove(task)
但是编译器说
不能在不可变值上使用变异成员是仅获取属性
我试图将关键字"变异"添加到get中,但这不起作用。我也试图在 var 中添加"突变",但这也不起作用。
UPD我不明白,为什么我需要设置?如果我这样做
func getSoketTasksList() -> Set<CXSocketTask> {
return socketManager.tasksList
}
我可以
getSoketTasksList().remove(task)
为什么不使用 var?
我不需要设置,只需要得到
是的,您确实需要设置。
我需要做这样的事情
soketTasksList.remove(task)
这是一种突变。改变像 Set 这样的值类型需要能够设置。但是,您通过将其设置为只读计算变量来切断这种可能性。
UPD 我不了解为什么我需要设置? 如果我这样做
func getSoketTasksList() -> Set<CXSocketTask> { return socketManager.tasksList }
我可以
getSoketTasksList().remove(task)
不,你不能。试试吧。这是一个游乐场测试:
class CXSocketTask:NSObject{}
class SocketManager {
var tasksList = Set<CXSocketTask>()
}
let task = CXSocketTask()
let socketManager = SocketManager()
socketManager.tasksList.insert(task)
func getSoketTasksList() -> Set<CXSocketTask> {
return socketManager.tasksList
}
getSoketTasksList().remove(task)
最后一行生成一个错误:"不能在不可变值上使用变异成员:'getSoketTasksList'返回不可变值"。
您可以使用临时变量来实现此目的:
var list = soketTasksList
list.remove(task)
请注意,基础列表(在本例中为socketManager.tasksList
)保持不变。
唯一可以执行此操作的情况是,如果实际的突变是通过可设置的来完成的。
例如:
struct Person {
var age: Int = 1
mutating func setAge(a: Int) -> Int {
age = a
return a
}
var computedAge: Int {
mutating get {
setAge(a: 4)
return age
}
}
}
var person = Person()
print(person.computedAge) //Prints 4
这是设计使然