簡體   English   中英

Swift 2字典 <String, AnyObject> 構造getter / setter引發拋出不能下標值…索引類型為&#39;String&#39;的問題

[英]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。 另外,我想指出幾件事。

  1. 您不應該寫入您的計算屬性。 而是查看存儲的屬性。 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-ID259

  2. 除非您要擴展字典,否則不能對類的屬性進行下標。 要在閉包內訪問類的屬性,請使用self.completedTask。

  3. 您不能簡單地將創建的類型的集合轉換為字典的集合。

  4. 我實際上看不到任何轉換為​​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 ,因為StringStruct而不是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM