2016-04-27 74 views
0

我有一個變種如何實現只讀VAR與不同誘變得到

var soketTasksList:Set<SocketTask> { 
    get { return socketManager.tasksList } 
} 

我並不需要設置,只得到, 但我需要做這樣的事情

soketTasksList.remove(task) 

但編譯器說

Cannot use mutating member on immutable value is a get-only property

我試圖添加關鍵字'mutating'的get,但這是行不通的。我也 試圖添加'變異'的變種,但這也不工作。

UPD 我不知道爲什麼我需要設置? 如果我做

func getSoketTasksList() -> Set<CXSocketTask> { 
    return socketManager.tasksList 
} 

我可以

getSoketTasksList().remove(task) 

爲什麼不使用var?

+0

但它不會是隻讀的,我不需要做設置,我需要從我的var變異結果 –

+0

您的tasksList聲明爲可變嗎? – gagarwal

+0

如果沒有setter方法,只讀計算屬性不能突變。即使你不需要改變持有列表的變量,它也會無意中使列表不可變。 –

回答

3

i don't need to set, only get

是的,你做需要設置。

i need do something like this soketTasksList.remove(task)

這是一個突變。突變value type like Set需要設置的能力。但是,通過將其設置爲只讀計算變量,可以切斷這種可能性。


UPD i dont undestand why do I need set? if i do

func getSoketTasksList() -> Set<CXSocketTask> { 
     return socketManager.tasksList 
    } 

i can

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的回報率不變的價值」。

+0

請參閱我的答案在這裏:http://stackoverflow.com/a/36000944/341994正如我在那裏解釋,值類型是不可變的_ place_。像'remove'這樣的移動要求我們能夠將其重新寫回reference_。但這正是隻讀變量無法做到的。 – matt

+0

但我從var鏈接到對象,這不是複製對象。如果它的鏈接,我可以做任何事情 –

+1

@EvGeniyIlyin你可以_say_,但你錯了。編程是關於_reality_,而不是與你_believe_。 – matt

0

您可以使用臨時變量用於此目的:

var list = soketTasksList 
list.remove(task) 

注意,基礎列表(socketManager.tasksList在這種情況下)保持不變。

+0

「請注意,潛在的列表保持不變」你是完全正確的,但它不會達到目的。他想要改變潛在的列表。如果他對該列表的引用是通過只讀計算變量的方式,他根本無法做到這一點。 – matt

相關問題