在Swift 3中强制使用特定的初始化程序

时间:2016-10-14 02:25:58

标签: swift initialization

我正在尝试创建一个继承自NSObject的类,只能在给定所需参数的情况下对其进行初始化。我可以这样做:

class MyTestClass: NSObject {
    var myTestValue: String
    var myTestValue2: String
    var myTestValue3: String

    private override init() {
        myTestValue = ""
        myTestValue2 = ""
        myTestValue3 = ""
        super.init()
    }

    init(value: String, value2: String, value3: String) {
        myTestValue = value
        myTestValue2 = value2
        myTestValue3 = value3
        super.init()
    }
}

有没有更好的方法来实现这一点而无需复制类变量的初始化?

显然,选项是一个选项,但我不想走那条路。有什么建议可以更简洁的方式实现同​​样的目标吗?

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您是否只想使用初始化程序参数中给出的值来初始化此类的对象?

这样就够了吗?

import Foundation

class MyTestClass: NSObject {
    let myTestValue: String
    let myTestValue2: String
    let myTestValue3: String

    init(myTestValue: String, myTestValue2: String, myTestValue3: String) {
        self.myTestValue = myTestValue
        self.myTestValue2 = myTestValue2
        self.myTestValue3 =  myTestValue3
        super.init()
    }
}

//...
MyTestClass() //Disallowed

不带参数调用会出现此错误:

ERROR at line 16, col 12: missing argument for parameter 'value' in call
MyTestClass()
           ^
INFO at line 8, col 5: 'init(value:value2:value3:)' declared here
    init(value: String, value2: String, value3: String) {
    ^

来自Swift Language guide

  

Swift为任何结构或类提供默认初始值设定项,为其所有属性提供默认值不提供至少一个初始化程序。默认初始值设定项只是创建一个新实例,其所有属性都设置为默认值。

根据您的需要,您还可以使用结构。如果没有提供其他初始值设定项,则它们提供成员智能初始值设定项:

struct MyTestStruct {
    let myTestValue: String
    let myTestValue2: String
    let myTestValue3: String
}

// Implicit member-wise initializer:
_ = MyTestStruct(myTestValue: "a", myTestValue2: "b", myTestValue3: "c")