0

我正在为使用结构的类属性编写 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'

这是怎么回事?我认为这是一个简单的解决方法,但我尝试了几种不同的选项,但它不起作用。

4

3 回答 3

1

很抱歉这么说,但是您的代码完全错误。

值得注意的是,这段代码没有为我编译。我正在使用 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)")
于 2016-02-16T06:51:22.083 回答
0

该错误仅仅是因为我没有在 getter 中转换类型:

getValue.append(CompletedTask(uuid: $0["uuid"], amount: nil))

本来应该:

getValue.append(CompletedTask(uuid: $0["uuid"] as? String, amount: nil))
于 2016-02-16T06:53:59.410 回答
0

第一件事,

if let amount = $0.amount where $0.amount != nil

是多余的,因为没有该where子句的可选绑定保证if let满足条件时数量不为零。

至于该消息,请更改AnyObjectAny,String是 aStruct而不是 a ClassAnyObject仅适用于类。

更多关于Anyvs的信息AnyObject可以在这里找到

于 2016-02-16T04:54:51.653 回答