swift - 更新从 Alamofire 请求创建的 SwiftyJSON 对象

标签 swift alamofire swifty-json

我正在尝试在表格 View 中显示从网站提取的一些 JSON 数据。最初,一切都很好。我将 JSON 数据声明为实例变量:

var tableData:JSON!
{
    didSet
    {
        tableView.reloadData()
    }
}

然后我在某处发出请求 - viewDidLoad 或 viewWillAppear 或通过用户下拉 tableView 进行刷新或其他什么,并不重要 - 设置数据,然后重新加载表。一切都很好。

request(method, url, parameters: parameters, encoding: ParameterEncoding.URL).responseJSON(options: NSJSONReadingOptions.AllowFragments) { (request, response, json, error) -> Void in
            self.tableData = JSON(json!)
        }

但是,有时我不仅仅是想显示数据,而是想让用户更新数据,例如在文本字段中。这就是我遇到问题的地方。

因此,我创建了一个带有文本字段的 TableView 单元格,并用从 tableData JSON 中提取的一些文本填充它,到目前为止一切顺利。然后,我的用户可以更改文本字段,并且我想通过文本字段的委托(delegate)方法更新 tableData。这对我不起作用。

func textFieldDidEndEditing(textField: UITextField)
{
    let key = "anExampleKey"
    tableData[key] = JSON(textField.text)
    println(tableData[key]) // the original value, not textField.text
}

似乎什么也没发生,“anExampleKey”的 tableData 值保持不变。因此,如果该单元格滚动离开屏幕,然后返回 View ,则我的用户所做的任何更改都会丢失,并且会恢复为原始值。

但这似乎只是从 Alamofire 请求创建的 JSON 值的问题。例如,如果我这样做:

func textFieldDidEndEditing(textField: UITextField)
{
    let key = "anExampleKey"
    var json = JSON([key:tableData[key].stringValue])
    tableData[key] = JSON(textField.text)
    json[key] = JSON(textField.text)
    println(tableData[key]) // the original value, not textField.text
    println(json[key]) // textField.text
}

json 变量将更新以反射(reflect) textField,而 tableData 仍将具有其原始值,而不是 textField 中的值。有谁知道为什么通过 Alamofire 请求创建的 JSON 对象是不可变的,而直接从字典创建的对象却不是?

最佳答案

好吧,我明白了。它与 SwiftyJSON 或 Alamofire 无关,而是我将实例变量声明为可选展开的事实。我仍然不完全确定可选变量和隐式解包变量的所有规则,但使用常规 JSON 变量而不是 JSON!允许我更新它。

var tableData:JSON! /* won't update */
var tableData:JSON = JSON([:]) /* will update */ 

我不知道为什么会这样。我以为我现在已经了解了 Swift 可选和隐式展开的规则,但我想还没有。这几乎就像每次我隐式解开 JSON 一样!变量,它创建一个新的副本并更新它,保持实例变量不变。我启动了一个 Playground ,看看这对于所有隐式解包的结构是否都是正确的,但事实并非如此,我可以在那里更新隐式解包的结构的实例值。有趣,可选 JSON?值确实会更新。

struct Test
{
    var myVar = 0
}

var myTest:Test!

myTest = Test() /* myVar = 0 */
myTest.myVar = 7 /* myVar = 7 */
myTest.myVar /* myVar = 7 still */

var implicitlyUnwrappedJSON:JSON!
implicitlyUnwrappedJSON = JSON(["Test":"This is one"])
implicitlyUnwrappedJSON["Test"] = "This is another one"
implicitlyUnwrappedJSON["Test"].string /* This is one */
implicitlyUnwrappedJSON?["Test"] = "This is another one"
implicitlyUnwrappedJSON["Test"].string /* This is another one */
implicitlyUnwrappedJSON!["Test"] = "This is another one yet"
implicitlyUnwrappedJSON["Test"].string /* This is another one yet */

var optionalJSON:JSON?
optionalJSON = JSON(["Test":"This is one"])
optionalJSON?["Test"] = "This is another one"
optionalJSON?["Test"].string /* This is another one */
optionalJSON!["Test"] = "This is another one yet"
optionalJSON!["Test"].string /* This is another one yet */

var json:JSON = JSON(["Test":"This is one"])
json["Test"] = "This is another one"
json["Test"].string /* This is another one */

所以我对这里发生的事情一无所知,但我可以正常工作。

关于swift - 更新从 Alamofire 请求创建的 SwiftyJSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31682793/

相关文章:

swift - SKEmitterNode 对另一个对象的强制爆炸

swift - 计算从固定开始时间到不同时间点的耗时

ios - 发布申请/x-www-form-urlencoded Alamofire

json - 如何使用 Alamofire 从本地主机的 API 获取 JSON | swift

json - 使用 SwiftyJSON 的 Swift 可失败初始化器

ios - 无法使用类型为 'Double' 的参数列表调用类型为 '(String?)' 的初始值设定项

swift - 简单的坐标位置

swift - 使用 alamofire 排队

json - 带有嵌套 JSON 参数的 Alamofire 发布请求

json - UITableView 不使用 SwiftyJSON 和 Alamofire 加载数据