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

Posted

技术标签:

【中文标题】如何解决错误:无法调用类型为 `......` 的参数列表类型为 `...` 的初始化程序?【英文标题】:How to solve the error: Cannot invoke initializer for type `......` with an argument list of type`...`? 【发布时间】:2017-10-20 12:20:08 【问题描述】:

我需要帮助解决错误:

无法使用类型为“(items: [String], seen: 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)

【问题讨论】:

好吧QuotesViewController.RandomItems 没有init(items:seen:) 【参考方案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

【讨论】:

以上是关于如何解决错误:无法调用类型为 `......` 的参数列表类型为 `...` 的初始化程序?的主要内容,如果未能解决你的问题,请参考以下文章