2015-05-20 42 views
1

我目前正在開發一個應用程序,並且由於某種原因陣列自發排空。陣列自發排空

我第一次在文件上提到它:

let scaleTypes = [String]() 

我然後填充它(我確認它是由運行陣列的一個println填充):

let scaleTypes = scaleTypesDict.valueForKey("Types")! as! [String] 
println(scaleTypes.count) 

當我訪問該陣列(填充UITableViewCells的內容時):

cell.textLabel!.text = scaleTypes[indexPath.row] 

我得到fatal error: Array index out of range。我在訪問數組之前直接完成了數組的println,並發現它自己被清空(它打印0)。該文件中沒有提到該數組。我在這個應用程序的另一個視圖控制器中使用了一個類似的變量名,但我非常懷疑這是造成這個問題。任何人都有什麼?

編輯:如果查看整個源代碼將有所幫助,可以在這裏找到:https://gitlab.carson-greene.com/cgreene/scales-ios/tree/dev/Scale%20Randomizer。不幸的是,我沒有很好的評論過。被警告。發生此錯誤的文件是SRSettingsViewController.swift文件。

回答

3

您聲明兩個不同的變量稱爲scaleTypes本地範圍的陣列。

第一個是一個成員變量,它自從聲明爲let後初始化爲空,將永遠不會包含任何內容。

然後,在你viewDidLoad您聲明稱爲scaleTypes一個,局部變量。您可以在其中添加值,但它只存在於您的viewDidLoad函數正在運行時,它掩蓋了該成員變量。當該功能退出時,它消失。

在其他功能的其他地方,當您訪問scaleTypes時,您正在訪問該空的成員變量。

如果您將var聲明爲您的成員變量,然後將let放在viewDidLoad的賦值前面,則可以按照您的希望將值分配給成員變量。

+0

啊,當然。感謝您指出我的大腦放屁! –

3

你寫let scaleTypes第二次,你聲明陣列,本地它在方法。

改變你的第一letvar,然後追加值後,而不是做一個新的陣列。另外,你不應該使用valueForKey()。只需使用鍵標:

// Declare the variable as mutable 
var scaleTypes = [String]() 


// Later, add new variables… 
if let newScales = scaleTypesDict["Types"] as? [String] { 
    scaleTypes += newScales 
} 
+0

你快了55秒:P – Kametrixom

2

填充陣列之前取出let,要創建具有相同名稱