Ios Xcode 9.0测试版:swift“;无法初始化类对象";调用Type.init()时

Ios Xcode 9.0测试版:swift“;无法初始化类对象";调用Type.init()时,ios,swift,xcode,swift3,xcode9-beta,Ios,Swift,Xcode,Swift3,Xcode9 Beta,我刚升级到Xcode 9.0测试版,现在我的应用程序在发布时崩溃了 2017-06-09 14:35:18.817213-0700 recharge-consumer-ios[13524:1720597] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[recharge_consumer_ios.SignedOutContainerViewController&l

我刚升级到Xcode 9.0测试版,现在我的应用程序在发布时崩溃了

2017-06-09 14:35:18.817213-0700 recharge-consumer-ios[13524:1720597] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[recharge_consumer_ios.SignedOutContainerViewController<0x105c691b8> init]: cannot init a class object.'
*** First throw call stack:
(
0   CoreFoundation                      0x000000010caf4f6b __exceptionPreprocess + 171
1   libobjc.A.dylib                     0x000000010ba3e121 objc_exception_throw + 48
2   CoreFoundation                      0x000000010cb7f6ff +[NSObject(NSObject) init] + 127
3   recharge-consumer-ios               0x0000000105322223 _T021recharge_consumer_ios22RechargeViewControllerCACycfCTD + 19
其中
MyViewControllerProtocol
是:

protocol MyViewControllerProtocol {
    // some other fields here too
    init()
}
class MyViewController: UIViewController, MyViewControllerProtocol {
    required init() {
        fatalError("init has not been implemented")
    }

    init(nibName nibNameOrNil: String?) {
        super.init(nibName: nibNameOrNil, bundle: nil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
失败的实例如下所示:

class SignedOutContainerViewController: MyViewController {

    required init() {
        super.init(nibName: "SignedOutContainerViewController")
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
其中
MyViewController
为:

protocol MyViewControllerProtocol {
    // some other fields here too
    init()
}
class MyViewController: UIViewController, MyViewControllerProtocol {
    required init() {
        fatalError("init has not been implemented")
    }

    init(nibName nibNameOrNil: String?) {
        super.init(nibName: nibNameOrNil, bundle: nil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

你知道哪里出了问题,或者有没有其他地方的指示?Xcode 9.0 Beta(9M136h),swift 3。

使用@objc作为崩溃的方法

我想跟进,因为接受的答案对我不起作用。所有这些都是从2017年6月12日开始在操场上使用swift 4.0开发快照工具链对Xcode进行测试的

这将失败,并出现运行时异常

import Foundation

public protocol MyProtocol {
    init()
}

@objc // This doesn't work
public class MyClass: NSObject, MyProtocol {

    @objc // This doesn't work either
    required public override init() {
        super.init()
    }
}

let anonymousType: AnyClass = MyClass.self

let metaType: MyProtocol.Type = anonymousType as! MyProtocol.Type
let instance = metaType.init()
对我来说,这并不像用
@objc
标记类或方法那么简单。我找到了两个适合我的解决方案

  • 为班级期末考试打分

    import Foundation
    
    public protocol MyProtocol {
        init()
    }
    
    final public class MyClass: NSObject, MyProtocol {
    
        required public override init() {
            super.init()
        }
    }
    
    let anonymousType: AnyClass = MyClass.self
    
    let metaType: MyProtocol.Type = anonymousType as! MyProtocol.Type
    let instance = metaType.init()
    
  • 标记协议@objc

    import Foundation
    
    @objc
    public protocol MyProtocol {
        init()
    }
    
    public class MyClass: NSObject, MyProtocol {
    
        required public override init() {
            super.init()
        }
    }
    
    let anonymousType: AnyClass = MyClass.self
    
    let metaType: MyProtocol.Type = anonymousType as! MyProtocol.Type
    let instance = metaType.init()
    

  • 无需复制,请向我们展示您如何声明一致性类以及如何调用该方法。@Kevin更新了完整的层次结构。调用是第一个代码块中的“type.init()”。如果改用
    MyViewController.type
    ,它还会崩溃吗?@PauloMattos没有,但我的想法是,我通过调用SetAndRefreshChildViewControllers来控制我的应用程序流,这些类型具有实现MyViewControllerProtocol的各种ViewControllers数组。所以只有使用MyViewController才能达到目的。@Eric…是的,我明白;)我希望所有视图控制器都是
    MyViewController
    子类,就像示例中的
    signedoutcontainerservicewcontroller
    ,因此使用超类或协议元类型没有多大关系。