首页 > 解决方案 > 视图控制器所需的便利性导致的 Swift 错误

问题描述

我正在玩弄一个在视图控制器中设置登录名的工厂,以满足我自己正在发生的事情(这是我正在更新的旧代码)我试图让这个尽可能简单的例子。

它崩溃了!

视图控制器

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

//called to initialize the login server class
public init?(coder aDecoder: NSCoder, loginServerClass: String){
    super.init(coder: aDecoder)
}

//called from storyboard
required convenience init?(coder aDecoder: NSCoder) {
    self.init(coder: aDecoder)
    }

使用登录工厂

public protocol LoginFactoryProtocol{
    static func createLogin () -> String
}

class LoginFactory : LoginFactoryProtocol {

    static public func createLogin () -> String {
        return "testlogintype"
    }
}

所以1)。它与上面的最小示例崩溃(访问错误)

2)。当我添加我喜欢的便利 int 时,它会崩溃,如下所示:

required convenience init?(coder aDecoder: NSCoder) {
    self.init(coder: aDecoder, loginServerClass: LoginFactory.createLogin() )
}

(此编码器要求从 initWithCoder 返回替换的对象:)

如何编译这个最小代码?

Github 链接https://github.com/stevencurtis/initissue

如果投票者可以解释原因,那将不胜感激,因为如果不知道需要添加什么,我就无法改进。我已经添加了错误消息,一个带有问题的 Github 链接。我已经列出了我尝试过的内容,并且我将从现有的先前工作代码到一个小示例(因此我已经尝试过,文档是https://docs.swift.org/swift-book/LanguageGuide/ Initialization.html#//apple_ref/doc/uid/TP40014097-CH18-XID_324和关于堆栈溢出的类似问题没有帮助(他们似乎有相同的问题,即(NSGenericException:此编码器要求从 initWithCoder 返回替换的对象)) )。根据定义,这是问题的一个小例子。我相信这是一个问题的结构(来自https://stackoverflow.com/help/how-to-ask),所以请告诉我:我还需要做什么才能写出一个好问题,好吗?

标签: iosswift

解决方案


一种解决方案(我不知道这是否是一种好习惯)似乎是使用一个调用 super.init 的初始化程序

public required init?(coder aDecoder: NSCoder) {
    loginServerClass = LoginFactory.createLogin()
    super.init(coder: aDecoder)
}

然后有一个用于测试和模拟的初始化程序(或从代码中创建视图控制器)

init(loginServerClass: String){
    self.loginServerClass = loginServerClass
    super.init(nibName: nil, bundle: nil)
}

推荐阅读