如何使用突变 get 实现只读变量



我有一个变量

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

这是设计使然

最新更新