2017-06-09 18 views
0

我刚升级到Xcode 9.0 Beta,现在我的应用程序在启动时崩溃。Xcode 9.0 Beta:当调用Type.init()时,swift“无法初始化类对象”

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 

是失败的(简化)呼叫:

func setAndRefreshChildViewControllersWithTypes(_ types: [MyViewControllerProtocol.Type]) { 
    for type in types { 
     let controller = type.init() as! UIViewController // This is what crashes 
    } 
    ... 
} 

其中MyViewControllerProtocol是:

protocol MyViewControllerProtocol { 
    // some other fields here too 
    init() 
} 

,这是失败的样子实例:

class SignedOutContainerViewController: MyViewController { 

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

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

其中MyViewController是:

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),迅速3.

+0

没有摄制,向我们展示你如何申报在贴合类,以及如何你称之为方法。 – Kevin

+0

@Kevin更新了完整的层次结构。该调用是第一个代码块中的“type.init()”。 – Eric

+0

如果您改用MyViewController.Type,它是否仍然崩溃? –

回答

0

使用@objc针对崩溃

2

我想跟进,因为公认的答案并没有为我工作的方法。所有这些都在6/12/17使用Xcode的swift 4.0开发快照工具链在游乐场中进行了测试。

这将失败,运行时异常

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类或方法简单。我发现了两种解决方案可以为我工作。

  1. 马克级决赛

    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() 
    
  2. 马克协议@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() 
    
相关问题