2015-06-16 69 views
0

我有一個類對象的數組,我想在特定的索引處移除其中的一個。該類包含簡單變量。我嘗試使用方法removeAtIndex(index)。 但我得到錯誤: 類型'[FieldData]'的不可變值只有名爲'removeAtIndex'的變異成員 我發現要解決這個問題,我應該在我的方法的func之前編寫變異。但現在我得到的錯誤: 「變異」是無效在類或類綁定協議方法從數組對象中移除條目

有人點我在正確的方向一個答案,我錯了在使用類爲了這? 或者我的問題在這裏?

感謝您的幫助。

一般類定義:

class FieldData {  
    //string variables 

    init(variables) { 
     ... 
    } 
} 

方法定義

mutating func WandBestandEntf(fields: [FieldData]) -> [FieldData]? { 
    for var n = 0 as Int; n < fields.count; n++ { 
     if fields[n].name == "something" || fields[n].name == "other thing" { 
      fields.removeAtIndex(n) 
     } 
    } 
} 

回答

4

在迅速功能參數在默認情況下是恆定的。所以你不能改變它。

在您的方法中,只需在參數名稱前添加var

func WandBestandEntf(var fields: [FieldData]) -> [FieldData]? { 
    for var n = 0 as Int; n < fields.count; n++ { 
     if fields[n].name == "something" || fields[n].name == "other thing" { 
     fields.removeAtIndex(n) 
     } 
    } 
    return fields 
} 
+0

由於是知道一件好事:d – Adarkas2302

+0

@ Adarkas2302深受歡迎。如果它真的幫助你,請接受答案 – iDhaval

+0

是的,是否需要等一會兒才能接受它。 – Adarkas2302

4

Dhaval Thanki的答案是解決問題的一種方法。出於同樣的完整性,有另一種方式來達到同樣的,通過參考而不是值的參數傳遞給方法:

func WandBestandEntf(inout fields: [FieldData]) { 
    for var n = 0 as Int; n < fields.count; n++ { 
     if fields[n].name == "something" || fields[n].name == "other thing" { 
      fields.removeAtIndex(n) 
     } 
    } 
} 

inout修飾符告訴該fields參數是通過引用傳遞的方法,因此它可以在方法體內進行更新,並且對其進行的任何更改都將在原始數據上執行,而不是其副本(因爲它通過使用var發生)。

由於發生了更改,因此不需要返回更新的數據。

還要注意的是,爲了該參數是按引用傳遞作出明確,調用它必須由&運營商,這意味着「參考」爲前綴的方法時:

var array = [...] 
WandBestandEntf(&array) 

末請注意傳遞給方法的參數必須是可變的(即用var聲明)。試圖引用傳遞給一個不可變的會引發一個明顯的編譯錯誤:

let array = [...] 
WandBestandEntf(&array) // Error: Cannot assign to immutable value of type '[FieldData]'