【问题标题】:Swift error: "class cannot be constructed because it has no accessible initializers"Swift 错误:“无法构造类,因为它没有可访问的初始化程序”
【发布时间】:2021-10-09 05:15:52
【问题描述】:

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”

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    即使您将框架设置为公共,您仍然需要将所有要使其可访问的类声明为“公共”。您的 init 方法也是如此。

    public init() {
    }
    

    为我做了诀窍。

    【讨论】:

    • 这为我解决了这个错误消息 - 需要将基类(我在其中覆盖了默认 init)编写为 override public init()
    【解决方案2】:

    首先,类有前导上限。方法具有前导小写字母。你的意思是MyColorclone()

    此时您正在混淆编译器:

    func Clone<myColor>() -> myColor {
    

    它认为你的意思是myColor 是一个隐藏类名的类型变量。所以当你到达myColor() 时,它与T() 基本相同,没有琐碎的构造函数。

    如果你把这些东西修好,你会发现正确的错误是

    Type 'MyColor' does not conform to protocol 'Prototype'
    

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

    【讨论】:

      【解决方案3】:

      似乎泛型生成类的扩展,需要使用。

      override init() {...
      

      请注意,Swift 中的任何类都必须有初始化程序。 在您的情况下,仍然是通用的,类必须具有 init()

      【讨论】:

        【解决方案4】:

        如果您尝试将新属性添加到子类而不添加新的初始化程序,则会遇到此错误。

        '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!
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-09-21
          • 2018-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-05
          • 1970-01-01
          相关资源
          最近更新 更多