![](/img/trans.png)
[英]swift: cannot subscript a value of type [Dictionary<String, AnyObject>] with an index of type string
[英]Swift 2 Dictionary<String, AnyObject> to Struct getter/setter throwing Cannot subscript value … with an index of type 'String'
我正在為使用結構的類屬性編寫一個getter / setter。 最終,它會從JSON中解析出來並轉換回JSON,以便將數據存儲在雲中。
// struct:
public struct CompletedTask {
var uuid: String!
var amount: Float?
}
// array of completed tasks on the class:
public var completedTasks: [CompletedTask] {
get {
var getValue: [CompletedTask] = []
if let _completedTasks = self["completedTasks"] as? [Dictionary<String, AnyObject>] {
_completedTasks.forEach({
getValue.append(CompletedTask(uuid: $0["uuid"], amount: nil))
})
}
return getValue
}
set(value) {
var setValue: [Dictionary<String, AnyObject>]
value.forEach({
if let amount = $0.amount where $0.amount != nil {
setValue.append(["uuid": $0.uuid, "amount": amount])
} else {
setValue.append(["uuid": $0.uuid])
}
})
self["completedTasks"] = setValue
}
}
設置器(我認為,盡管我無法測試)運行良好(無論如何都可以編譯)。 但是吸氣劑拋出:
Cannot subscript a value of type '[String : AnyObject]' with an index of type 'String'
這是怎么回事? 我認為這是一個簡單的修復程序,但是我嘗試了幾種不同的選擇,但沒有用。
抱歉,您的代碼是完全錯誤的。
值得注意的是這段代碼不是為我編譯的。 我正在使用Swift 2.0和xcode 7.2。 另外,我想指出幾件事。
您不應該寫入您的計算屬性。 而是查看存儲的屬性。 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-ID259
除非您要擴展字典,否則不能對類的屬性進行下標。 要在閉包內訪問類的屬性,請使用self.completedTask。
您不能簡單地將創建的類型的集合轉換為字典的集合。
我實際上看不到任何轉換為JSON的內容。 我假設您在代碼中的其他位置執行了此操作。
在您要創建一個計算屬性的假設下,該屬性將CompletedTasks的列表另存為Dictionary,並返回CompletedTask對象的列表。
public struct CompletedTask {
var uuid: String!
var amount: Float?
}
private var tasks : [[String: AnyObject?]] = []
var completedTasks: [CompletedTask] {
get {
var _cT : [CompletedTask] = []
tasks.forEach({
_cT.append(CompletedTask(uuid: $0["uuid"] as! String, amount: $0["amount"] as? Float))
})
return _cT
}
set (value) {
var _t : [[String: AnyObject?]] = []
value.forEach({
_t.append(["uuid": $0.uuid, "amount": $0.amount])
})
tasks = _t
}
}
let task_1 = CompletedTask(uuid: "1", amount: nil)
let task_2 = CompletedTask(uuid: "2", amount: nil)
completedTasks = [task_1, task_2]
print("Completed Tasks \(completedTasks)")
首先,
if let amount = $0.amount where $0.amount != nil
是多余的,因為不帶where
子句的可選綁定保證了滿足if let
條件時,金額不為nil。
對於該消息,將AnyObject
更改為Any
,因為String
是Struct
而不是Class
。 AnyObject
僅適用於類。
有關Any
vs AnyObject
更多信息,請參見此處 。
該錯誤僅是由於我沒有在getter中強制轉換我的類型:
getValue.append(CompletedTask(uuid: $0["uuid"], amount: nil))
本來應該:
getValue.append(CompletedTask(uuid: $0["uuid"] as? String, amount: nil))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.