2017-06-11 105 views
0

正如我所說的,當我聲明一個變量時出現錯誤。我無法在Google或Swift文檔上找到任何解決方案。 繼承人的代碼:EXC_BAD_ACCESS當聲明一個變量時

class Database { 
static let si = Database() // when removed it also resolves into an error 

init() { 
    print("Hello") // isn't printed. 
    self.setONs() // see code below to see where collected gets a new value 
    print("current device id: \(UIDevice.current.identifierForVendor!.uuidString)") // resolves into an error when declared as uuid which is now "TestUID" 
} 

var uuid: String = "TestUID" // its actual the device id. 
var gkid: String = "" // GKPlayerID 
var collected: [String : [String : Int]] = [:] // <- Thread 1: EXC_BAD_ACCESS(code=2,address=0x7fff59de4f8) 
private var collectedProgress: [String : [String : Int]] = [:] 

如果我刪除collectedProgress發生在collectedProgress壞的訪問。這兩個變量只能被聲明,不能被寫入或讀取。即使我也刪除了collectProgress變量,下一個變量也會出現相同的錯誤。

+0

我不能重現這個 - 你可以請儘量熬問題降到[MCVE] (並說你正在運行的是什麼版本的Swift) – Hamish

+0

我嘗試將其降至最低。 https://github.com/Aritmetic/Primal這整個項目呢。你不需要設置服務器,因爲在他做任何事情之前,錯誤都會阻止你。 – Aritmetic

回答

0

我解決了這個問題。我不是100%確定這是否是錯誤,但現在沒有EXC_BAD_ACCESS。 我在Database()中添加了一個sharedInstance,並用Database.sharedInstance替換了其他Classes/Objects中的Database()。現在所有對象都使用同一個對象。 Database(SocketIOManager.sharedInstance.on(「」){})中的接收器可能是問題。由於他們收到變量的更多值,還有一些更多,但正如他們在評論中所發生的錯誤一樣。 我希望你不會像我的代碼一樣得到同樣的錯誤/問題。

也謝謝你的幫助。

Fixed code on Github

0

您收集並收集的兩個變量進度設置不正確。您已將collected聲明爲包含String鍵和值爲[String:Int]的字典,但您正嘗試使用類型爲[Any:Any]的字典對其進行初始化。我不知道爲什麼甚至編譯。

試着改變你的代碼如下:

var collected = [String : [String : Int]]() 
private var collectedProgress = [String : [String : Int]]() 

與該代碼創建這些變量的初始值,並自動讓編譯器弄清楚它們的類型的數據類型。

您還可能要爲您創造[String : [String : Int]類型typealias:

typealias DictOfDicts = [String : [String : Int]] 

//... 

var collected = DictOfDicts() 
private var collectedProgress = DictOfDicts() 
+0

'[:]'* * * * *'[Any:Any]' - 這是一個字典文字,可以推斷爲'[String:[String:Int]]'很好,OP的代碼是完全合法的。 – Hamish

+0

感謝您糾正我關於'[:]'的性質。然而,事實是,OP代碼崩潰,並且隨着我的更改,它不再崩潰。 –

+0

很奇怪。當我第一次將OP代碼複製到遊樂場時,我得到了同樣的錯誤,但現在我把它放回去了,它不會再崩潰了。 –