如何解决错误:无法使用类型`...`的参数列表调用类型`......`的初始化器?

时间:2017-10-20 12:20:08

标签: swift struct save codable

我需要帮助解决错误:

  

无法使用类型为'(items:[String],see:Int)'的参数列表调用类型为'QuotesViewController.RandomItems'的初始值设定项。

这是我的代码:

struct RandomItems: Codable
{
    var items : [String]
    var seen  = 0

    init(_ items:[String])
    { self.items = items }

    mutating func next() -> String
    {
        let index = Int(arc4random_uniform(UInt32(items.count - seen)))
        let item  = items.remove(at:index)
        items.append(item)
        seen = (seen + 1) % items.count
        return item
    }
    func toPropertyList() -> [String: Any] {
        return [
            "items": items,
            "seen": seen
        ]
    }


    }
}

extension QuotesViewController.RandomItems {
    init?(propertyList: [String: Any]) {
        return nil
    }
}

let a = QuotesViewController.RandomItems(items: ["hello"], seen: 2) //<-- Error
let data: Data = try! JSONEncoder().encode(a)
let b = try! JSONDecoder().decode(QuotesViewController.RandomItems.self, from: data)

1 个答案:

答案 0 :(得分:1)

这一行

let a = QuotesViewController.RandomItems(items: ["hello"], seen: 2) //<-- Error

调用不存在的初始化程序。创建一个这样的:

init(items:[String], seen: Int)
{ 
    self.items = items 
    self.seen = seen
}

为了更好地衡量,请将现有的初始化程序更改为

init(_ items: [String])
{
    self.init(items: items, seen: 0)
}

因此,如果您需要向初始化程序添加额外的内容,则只需在一个位置执行此操作。

或者只有一个初始化

init(items:[String], seen: Int = 0)
{ 
    self.items = items 
    self.seen = seen
}