2014-07-13 119 views
11

既然Swift的數組真的是不變的,這要歸功於完整的值語義,我該如何創建一個不可變數組的可變副本?類似於Obj-C mutableCopy()。我當然可以將數組向下壓縮到一個NSArray並使用mutableCopy(),但不想使用NSArray,因爲它沒有嚴格鍵入。如何在swift中創建一個不可變數組的可變副本?

我有一個toolbar其中故事板中有items。我想從工具欄中刪除一個項目並使用toolbar.setItems。我想這樣做,而不是作爲NSArray投射,因爲這些功能都不需要NSArrays,它們需要[AnyObject]

顯然現在當我打電話removeAtIndex()它不起作用,這是正確的。我只是需要一個mutableCopy

簡單地分配給VAR我不工作,並給「Immutable value of type [AnyObject]

var toolbarItems = self.toolbar.items 
toolbarItems.removeAtIndex(2) //Immutable value of type [AnyObject] 

我使用Beta 3的

回答

18

問題是self.toolbar.items是隱含展開可選的,他們(類型[AnyObject]的!)總是不變的。如果將變量toolbarItems指定爲不明確指定其類型,則它也會變成隱式解包的可選項,因此也是不可變的。

爲了解決這個問題請執行:

var toolbarItems:[AnyObject] = self.toolbar.items 
toolbarItems.removeAtIndex(2) 

或者:

var toolbarItems = self.toolbar.items as [AnyObject] 
toolbarItems.removeAtIndex(2) 

更新

由於Xcode中的6 Beta版5,您可以更新存儲在可選的變量集合,所以原來的代碼現在可以工作:

var toolbarItems = self.toolbar.items 
toolbarItems.removeAtIndex(2) 
+0

這幾乎是我在我的回答中所說的,但是對引擎蓋下的內容進行了簡要的解釋 - 因此您應該得到我的讚賞 – Antonio

11

數組是值類型(結構),所以他們通過價值傳遞,而不是通過參考。這就是說,如果你創建一個數組類型的變量並且給它賦予不可變數組,那麼實際上會創建一個不可變數組的副本並將其分配給它 - 當然,該副本與原始的不可變數組沒有關係除了在創建時具有相同的值)。

let immutable = [1, 2, 3] 

//immutable[0] = 1 // Fails, ok 

var mutable = immutable 

mutable[0] = 5 

在你的情況,你正在訪問一個不變的陣列是AnyObject S(參見documentation)的NSArray。你可以使用它作爲一個迅速陣列,使得它的一個副本,並修改如下:

let immutable : NSArray = [ 1, 2, 3 ] 

//immutable[0] = 1 // Fails, ok 

var mutable : [AnyObject] = immutable 

mutable.removeAtIndex(1) // mutable now is [1, 3] 

mutable[0] = 7 // mutable now is [7, 3] 

你完成更改後,您可以分配給items財產

+0

這並不爲我工作我想是因爲測試3 ?: '變種toolbarItems = self.toolbar.items的;類型的 '[AnyObject]' toolbarItems.removeAtIndex(2)''//不可變值添加編輯問題。 – Johnston

+0

我認爲這個問題是因爲'self.toolbar.items'是一個'NSArray'。望着它 – Antonio

+0

也許在NSArray中,你需要多一點老派?嘗試'var mutable = immutable.mutableCopy()作爲NSMutableArray'? –

1

這是因爲很簡單,就像在數組中聲明var一樣。

var items = toolbar.items 

現在您可以更改項目,然後重新分配到工具欄。

toolbar.items = items 

請注意,您可以 不能(如Beta 3中的)改變與let聲明以及一個「不可改變的」數組中的元素。只有數組 的長度爲 已修復,這就是您無法刪除項目的原因。

但是,根據Apple的文檔UIToolbaritems陣列已經是可變的。

SWIFT
var items: [AnyObject]!

+0

看我的編輯。我不確定這是否是因爲Beta 3? – Johnston

+0

你最近的編輯('var b = a')在Xcode build 6A254o中工作正常。如果你嘗試'a [1] = 5',你會看到'b'被按預期改變。 – Mundi

+0

嗯我是笨蛋我不打算輸入那個。我刪除它。這確實有效,但由於某種原因'self.toolbar.items'仍然是不可變的。我認爲現在數組完全不可變,如果分配它們。從蘋果版本說明中可以看出:「Swift中的數組已經完全重新設計,具有像Dictionary這樣的全值語義,並且在Swift中字符串一直存在,這解決了各種可變性問題 - 現在'let'數組是完全不可變的, var'數組是完全可變的「 – Johnston

0

在Beta3的恆定陣列是完全不可變的,而變量數組是完全可變的。因此,只要改變讓數組:爲VAR陣列:然後檢查你的代碼

1

測試+作品:

var mutable : [UIBarButtonItem] = [] 
    for button in toolbar.items { 
     mutable += button as UIBarButtonItem 
    } 
    mutable.removeAtIndex(2) 
    toolbar.setItems(mutable, animated: true) 
1

要從陣列的特定索引中刪除對象。

let fullArray : NSArray = Userdefaults().value(forKey: "YOUR_ARRAY_STRING") as! NSArray 
var mutableArray : [AnyObject] = fullArray as [AnyObject] 
mutableArray.remove(at: INDEX_TO_REMOVE) //Eg: mutableArray.remove(at: 0) 
mutableArray.append(ARRAY_TO_APPEND) 
相關問題