我假设有一个函数定义如下:
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
方法调用中
获取ApiData
在初始化所有存储属性之前
还有这个
从初始值设定项返回而不初始化所有存储的属性
(如您在评论中所述)
好的让我们来解决它。
步骤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(建议)
在尾部封口内,您正在使用
!
。你应该尽可能避免这种情况。你没有检查
error
参数不能为nil。
你应该使用
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
关闭时
nil
.
步骤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
}
}
}
}
让我知道这是你需要的!