【问题标题】:Init a class with arguments on swift [duplicate]用swift的参数初始化一个类[重复]
【发布时间】:2018-01-27 06:33:48
【问题描述】:

我正在尝试在 Swift 中使用参数初始化一个类。我希望能够将数组传递给类。类似let test = MyTestClass(data)

代码:

init(data: [CGFloat]){
    super.init(nibName: "Test", bundle: nil)
    self.data = data
}

required init?(coder decoder: NSCoder) {

    super.init(nibName: "Test", bundle: nil)
}

错误:

【问题讨论】:

  • 您要在哪个 iOS 类上创建自定义初始化?
  • super.init(nibName:bundle:) 调用移动到init(data:) 中的最后一行
  • 所需的ini中仍有错误,属性self.date未初始化...
  • @J.Doe 正如 nayem 所说,您当前的类指定初始化程序首先被初始化,然后是超类 init。
  • 如果您是 Swift 新手,我建议您通过 this tutorial 了解更多关于Swift 中的初始化。本教程还有第二部分。

标签: swift initialization


【解决方案1】:

Swift 要求在初始化程序完成时设置所有参数。它还要求在调用另一个函数之前设置这些参数,这就是为什么之后调用超级初始化程序,而不是按照 Objective-C 的要求在第一行调用。

在普通初始化程序中,您将 data 的值设置为传入的数组。但您不是为 init(coder:) 方法这样做的。

有两种处理方法:

一种方法是在调用 init(coder:) 初始化程序时抛出一个断言。

required init?(coder decoder: NSCoder) {
    fatalError("Not meant to be initialised this way")
}

另一种是分配一个“空”值:

required init?(coder decoder: NSCoder) {
    data = [CGFloat]() // just set an empty array
    super.init(nibName: "Test", bundle: nil)
}

您选择的方法取决于您希望如何在您的域中使用代码。我主要选择第一个选项,因为调用不打算使用的初始化程序是开发人员错误,最好只为这些类型的错误崩溃。

【讨论】:

    【解决方案2】:

    您可以通过在init(coder 中调用super 之前初始化data 来解决错误,并在init(coder 中调用适当的super 方法

    let data : [CGFloat]
    
    init(data: [CGFloat]){
        self.data = data
        super.init(nibName: "Test", bundle: nil)
    }
    
    required init?(coder decoder: NSCoder) {
        self.data = [CGFloat]()
        super.init(coder: decoder)
    }
    

    或者将data声明为

    var data = [CGFloat]()
    

    那你就可以写了

    init(data: [CGFloat]){
        self.data = data
        super.init(nibName: "Test", bundle: nil)
    }
    
    required init?(coder decoder: NSCoder) {
        super.init(coder: decoder)
    }
    

    在任何情况下,您都必须在init(coder 中致电super.init(coder: decoder)

    【讨论】:

      猜你喜欢
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2012-04-30
      • 2020-12-15
      • 2011-05-11
      相关资源
      最近更新 更多