Swift错误:"无法构造类,因为它没有可访问的初始化程序"

14

Xcode给我的Swift代码报错:

'myColor'无法构建,因为它没有可访问的初始化程序

import Foundation

protocol Prototype {
    func Clone<T>() -> T
}

class myColor: Prototype {
    var red: Int?
    var green: Int?
    var blue: Int?
    
    init () {}
    
    func Clone<myColor>() -> myColor {
        let newColor = myColor()
        newColor.red = self.red
        newColor.green = self.green
        newColor.blue = self.blue
        
        return newColor
    }
}

错误出现在这一行:
let newColor = myColor()

类型'myColor'没有成员'init'

4个回答

21
即使您将框架设置为公共,仍然需要将要公开访问的所有类声明为“public”。对于init方法也是如此。
public init() {
}

对我很有用。


5
这对我解决了这个错误信息——基础类(其中我已经重写默认的init)需要被写成override public init()。 - leafcutter

9
首先,类名应该以大写字母开头。方法名应该以小写字母开头。你的意思是 MyColorclone()
你现在让编译器感到困惑了:
func Clone<myColor>() -> myColor {

它认为你的意思是myColor是一个类型变量,它遮蔽了类名。因此,当你到达myColor()时,它基本上相当于T(),而T()没有平凡的构造函数。
如果你修复这些问题,你会发现正确的错误是:
Type 'MyColor' does not conform to protocol 'Prototype'

那个错误是完全不同的问题。请参阅Protocol func returning Self以了解如何实现复制协议。您可能还会对后续内容感兴趣:Swift protocol and return types on global functions

1
如果您试图在子类中添加新属性而没有添加新的初始化程序,则会出现此错误。
“SomeSubclass”无法构建,因为它没有可访问的初始化程序。
突然间,现有超类的所有初始化程序都将无效,因为新变量需要在子类的init()方法中设置(该方法尚不存在)。
class SomeSubclass: UIViewController { // Class 'SomeSubclass' has no initializers

    var date: Date
    
    class func `for`(_ date: Date) -> SomeSubclass {
        let someSubclass = SomeSubclass() // 'SomeSubclass' cannot be constructed because it has no accessible initializers
        someSubclass.date = date
        return someSubclass
    }
        
}

对大多数UIViewController情况的修复方法是声明子类属性为可选项或隐式解包可选项,这通常用于IBOutlets,这将在使用现有的超类init方法时有效且初始化为nil。然后在初始化后立即设置该值。

var date: Date?
// - or - //
var date: Date!

0

看起来是生成类的通用扩展,并需要使用。

override init() {...

请注意,Swift 中的任何类都必须有初始化器。 而在您的情况下,尽管是泛型类,但该类必须有 init() 方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接