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

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

【讨论】:

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

如何解决未捕获的类型错误:无法读取未定义的属性“调用”?

无法使用参数列表调用类型“附加”

求sql中解决连接错误 无法将类型为“System.__ComObject”的 COM 对象强制转换为接口类 型

无法使用类型为“(字符串)”的参数列表调用“执行选择器”

无法调用非函数类型“URL”的值

如何解决此错误:无法将类型“__NSCFString”(0x10354a248)的值转换为“UIImage”(0x104c42b48)