0
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)
4

2 回答 2

0

您的错误是因为CollectionType是一个无法初始化的协议。您是否尝试过创建一个帮助类方法来返回您的集合,例如

func collectionWithData(data: [[String: AnyObject]]) -> [Generator.Element] {
于 2016-02-13T10:57:45.277 回答
0

让我们定义一个协议

protocol P {
    init?(b: Bool)
}

正如 Oliver 所说,协议无法初始化,但我们仍然可以在协议扩展中定义 init

extension P {
    init?(b: Bool) {
        print("init defined in extension")
        if b == false { return nil }
        self.init(b: b)
    }
}

看,你不能从 init 返回任何东西,但 nil (如果初始化失败)

让我们定义一个符合我们协议的类

class C: P {
    var b: Bool
    required init(b: Bool) {
        self.b = b
    }
}

看看下一个片段会发生什么

let c1: C? = C(b: false)
let c2 = C(b: false)
dump(c1)
dump(c2)
/*
init defined in extension
- nil
▿ C #0
  - b: false
*/

相同的表达式C(b: false)给了我们两个不同的结果:-)。所以,如果你定义init和init要小心?通过协议扩展。如果您尝试定义 init 和 init? 没有协议扩展的相同参数,编译器会抱怨。

于 2016-02-13T11:39:54.520 回答