【发布时间】:2016-02-13 10:25:03
【问题描述】:
protocol Decodable {
init?(data: [String: AnyObject])
}
struct A: Decodable {
var data: [String: AnyObject]!
init?(data: [String: AnyObject]) {
self.data = data
}
}
这在我想创建一个对象时有效
let d = ["name":"Rahul"]
let a = A(data: d)
我正在尝试实现以下目标,但它在编译时出现错误。
let dArray = [["name":"Rahul"],["name":"Rahul"],["name":"Rahul"]]
let aArray = [A](data: dArray)
以下代码给了我错误“nil 是初始化程序中唯一允许的返回值”。
public extension CollectionType where Generator.Element: Decodable {
init?(data: [[String: AnyObject]]) {
var elements: [Generator.Element] = []
for d in data {
let element = Generator.Element(data: d)
if let element = element {
element.append(element)
}
}
return elements
}
}
================================== 答案:-
public extension Array where Element: Decodable {
init?(data: [String: AnyObject]) {
var elements: [Element] = []
for d in data {
let element = Element(data: d)
if let element = element {
element.append(element)
}
}
self = elements
}
}
这将允许您使用以下代码进行初始化
let dArray = [["name":"Rahul"],["name":"Rahul"],["name":"Rahul"]]
let aArray = [A](data: dArray)
【问题讨论】:
-
你能解释一下你想做什么吗?
-
我添加了更多信息。我想通过扩展集合类型来实现 let aArray = [A](data: dArray)。
-
@RahulKatariya 在 Swift 中,初始化器没有返回值。这与 Obj-C 不同。在初始化失败的情况下,您使用
return nil来指示可能触发初始化失败的点。此外,您不要使用return关键字来指示初始化成功。所以编译器抱怨你的return elements声明,因为你不能返回任何东西,除了 nil ... -
@RahulKatariya:你想做什么?这段代码应该是什么
let a = A(data: d)? -
感谢旋风。我的错。所以我必须扩展 Array 然后才有一个 init 方法。
标签: ios swift swift2 swift-protocols