ios - 使用可选的初始化程序扩展 CollectionType

标签 ios swift swift2 swift-protocols

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)

最佳答案

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

func collectionWithData(data: [[String: AnyObject]]) -> [Generator.Element] {

关于ios - 使用可选的初始化程序扩展 CollectionType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35378704/

相关文章:

ios - UITableView 刷新时无法滚动

ios - 异常 - 发送到实例的无法识别的选择器在调用时被抛出

ios - libMobileGestalt MobileGestalt.c :890: MGIsDeviceOneOfType is not supported on this platform

swift - SceneKit:在 SCNView 上渲染 SpriteKit 粒子系统时应用程序崩溃,当所有代码似乎都是系统代码的一部分时如何调试

ios - 字典没有名为 'allKeys' 的成员 - swift2 获取所有字典键失败并出现错误

macos - MAC OS Xcode Swift 2.2 将 NSImage 转换为 CIImage

IOS Swift,在表格底部显示文本字段

ios - 链接器错误 - Objective-C

iphone - 是否可以在没有源代码的情况下将 .app 文件安装到 iPhone 模拟器上

ios - 如何(我可以)从 NSFetchedResultsController 获取其他部分的内容吗?