【问题标题】:Force specific initialiser in Swift 3在 Swift 3 中强制使用特定的初始化器
【发布时间】:2017-02-23 08:12:43
【问题描述】:

我正在尝试创建一个继承自 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()
    }
}

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

显然,可选选项在这里是一个选项,但我不想走那条路。有什么更简洁的方法来实现同样的建议吗?

【问题讨论】:

    标签: swift initialization


    【解决方案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")
    

    【讨论】:

    • 噢!我尝试了很多方法,但不是因为我认为NSObjectinit 仍然可以访问!不知道我明白为什么它不是。有什么想法吗?
    • 初始化器不被继承。有关基本原理,请参阅this question。它是 Java,但这个想法适用于 Swift。
    • 我认为 Swift 语言指南的 this 部分可能更适用,因为它处理的是我的示例中的继承问题。
    猜你喜欢
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    相关资源
    最近更新 更多