【问题标题】:Multiple Initializers in a single class (swift)单个类中的多个初始化器(swift)
【发布时间】:2019-04-15 16:42:53
【问题描述】:

创建一个带有属性的三角形类来存储每条边的长度。三边长度不同的三角形称为不等边三角形,两条边长度相同的三角形称为等腰三角形,三边长度相同的三角形称为等边三角形。

为你的类创建一个初始化器,它接受三个参数并正确设置类属性。接下来,创建第二个初始化器以在三角形等边时使用。请记住,所有三个边的长度都相同,因此此方法应仅采用一个参数,但仍应设置所有三个属性。尝试先将此初始化程序编写为指定初始化程序,然后将其转换为便利初始化程序。 最后,我们需要一个带两个参数的等腰三角形的初始化器。想想你应该如何为你的参数设置外部名称,以明确哪个值将用于两侧

这个问题让我很困惑。我的问题是:我应该如何在单个班级中创建等腰和不等腰的init?还是我应该创建另一个类?我需要帮助。我是斯威夫特的新手。这是我到目前为止所得到的。

class Triangle {

    var sideA: Int
    var sideB: Int
    var sideC: Int

    init(sideA: Int, sideB: Int, sideC: Int) {

        self.sideA = sideA
        self.sideB = sideB
        self.sideC = sideC
    }

    convenience init(equilateralWithEdge edge:Int) {
        self.init(sideA: edge, sideB: edge, sideC:edge)
    }

}

【问题讨论】:

  • 您发布的代码很好。你的实际问题是什么?
  • 好吧,我为等边三角形创建了一个 init,我想知道如何将不等腰和等腰的 init 放在一个类中。
  • 您添加其他初始化程序与添加等边三角形的初始化程序完全相同。

标签: swift initializer


【解决方案1】:

以下是如何将另一个初始化器添加到将使用两个参数创建等腰三角形的同一类:

class Triangle {

    var sideA: Int
    var sideB: Int
    var sideC: Int

    init(sideA: Int, sideB: Int, sideC: Int) {

        self.sideA = sideA
        self.sideB = sideB
        self.sideC = sideA
    }

    init(sideA: Int, sideB: Int) {

        self.sideA = sideA
        self.sideB = sideB
        self.sideC = sideB
    }

    convenience init(equilateralWithEdge edge:Int) {
        self.init(sideA: edge, sideB: edge, sideC:edge)
    }

}

【讨论】:

  • 为什么不把第二个init 变成调用第一个的convenience
  • 感谢您的帮助。请不要这样想。问题来自一本书,名为“sams 在 24 小时内快速自学”。这不是功课,我正在考虑进入ios编程,所以我想拓宽我的知识。我一直是 C++ 人。
  • 好吧,我的假设不好,我会从我的答案中删除蛇。
  • @rmaddy:他也可以将第二个 init 设置为便利初始化器,但我相信他想向您展示使用第二个指定初始化器的示例和另一个使用便利的示例初始化器。请记住,无论您选择哪个,您都必须确保所有属性都已初始化,并且没有一个为空。并且所有便利 init 都必须指向一个指定的 init。大多数情况下,只使用一个指定的 init,而对其他 init 使用方便的 init,但归根结底,这取决于您的偏好。
【解决方案2】:
class Your_ViewController : UIViewController {

    var your_property_1 : String?
    var your_property_2 : String?

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

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

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) is not supported")
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多