目前我正在处理一个初始化多维数组的类:
class Manager {
var data: Dictionary<String,NSDictionary>
init(data: Dictionary<String,NSDictionary>) {
func getApiData() {
getApiDataResource() { responseObject, error in
let resourceA = responseObject!
self.data["resources"] = resourceA
}
}
}
}
异步返回的responseObject具有以下结构:
{
"data": [
{
id: 1
name: "Name1"
},
{
id: 2
name: "Name2"
}
],
"count": 2,
"success": true
}
我要在“数据”变量中获取的结构:
{
"resources": [
{
"resourceA":
{
"data": [
{
id: 1
name: "Name1"
},
{
id: 2
name: "Name2"
}
],
"count": 2,
"success": true
}
},
{
"resourceB": // and so on ...
}
]
}
但当将responseObject保存到“data”变量中时:
self.data["resources"] = resourceAData // this line fails
它打印:
Cannot assign to the result of this expression
有人能帮我解决这个问题吗??
谢谢和问候!
最佳答案
我假设有一个函数定义如下:
func getApiDataResource(callback: (responseObject:NSDictionary?, error:NSError?) -> ()) {
// data retrieved from server at warp 8 here and other futuristic things
}
步骤1(必需)
我把函数
getApiData
移到了init
之外。class Manager {
var data: Dictionary<String,NSDictionary>
init(data: Dictionary<String,NSDictionary>) {
getApiData()
}
func getApiData() {
getApiDataResource() { responseObject, error in
let resourceA = responseObject!
self.data["resources"] = resourceA
}
}
}
现在编译器正在抱怨:
在初始化所有存储属性之前在方法调用中使用
self
还有这个
从初始值设定项返回而不初始化所有存储的属性
(如你在评论中所述)
好的。我们把它修好。
步骤2(必需)
class Manager {
var data: Dictionary<String,NSDictionary>
init(data: Dictionary<String,NSDictionary>) {
self.data = data
getApiData()
}
func getApiData() {
getApiDataResource() { responseObject, error in
let resourceA = responseObject!
self.data["resources"] = resourceA
}
}
}
现在它确实可以正确编译了。
不过,我会调整一些其他的事情。
步骤3(建议)
在后面的闭包中,您正在使用
getApiData
。你应该尽量避免这样。您没有检查可能不是nil的!
参数。您应该使用
error
这是conditional unwrapping
的安全替代方案(您使用force unwrap
)。class Manager {
var data: Dictionary<String,NSDictionary>
init(data: Dictionary<String,NSDictionary>) {
self.data = data
getApiData()
}
func getApiData() {
getApiDataResource() { responseObject, error in
if let resourceA = responseObject where error == nil {
self.data["resources"] = resourceA
}
}
}
}
如果闭包中的
!
是responseObject
,则代码不会崩溃。步骤4(只是一个偏好)
这只是一种风格偏好。
Swift允许你这样定义字典(就像你那样)。
Dictionary<String,NSDictionary>
或者这样:
[String:NSDictionary]
2语句是等价的。我觉得第二个更重要。所以。。。
class Manager {
var data: [String:NSDictionary]
init(data: [String:NSDictionary]) {
self.data = data
getApiData()
}
private func getApiData() {
getApiDataResource() { responseObject, error in
if let resourceA = responseObject where error == nil {
self.data["resources"] = resourceA
}
}
}
}
让我知道这是你需要的!
关于arrays - Swift-NSDictionary多维,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31732646/