Swift 如何有多个 init()

How have multiple init() with Swift

是否有可能,如果可以,如何在 Class 中有多个不带参数的初始化(字符串只是一个例子):

aVar: String

init() {
   aVar = "simple init"
}

initWithAGoodVar() {
   aVar = "Good Var!"
}

initWithFooBar() {
   aVar = "Foo Bar"
}

您可以使用不同的 init parameters.When 创建您的 class 的新实例,使用您传入的参数调用 init 方法

你不能有多个没有参数的 inits,因为你想使用哪个 init 方法是不明确的。作为替代方案,您可以将初始值传递给 init 方法。以你的问题为例:

class MyClass {
    var myString: String

    init(myString: String) {
        self.myString = myString
    }
}

let a = MyClass(myString: "simple init")

或者,如果 myString 只是某些值,您可以使用 enum:

class MyOtherClass {
    enum MyEnum: String {
        case Simple  = "Simple"
        case GoodVar = "GoodVar"
        case FooBar  = "FooBar"
    }

    var myString: String

    init(arg: MyEnum) {
        myString = arg.rawValue
    }
}

let b = MyOtherClass(arg: .GoodVar)
println(b.myString) // "GoodVar"

不可能有多个初始化,采用相同的(或没有)参数。

但是如果您正在寻找一种方法来构造具有预定义状态的对象,您可以使用静态工厂方法:

class Test {

  let aVar: String

  init(aVar: String) {
    self.aVar = aVar
  }

  static func initWithAGoodVar() -> Test {
    return Test(aVar: "Good Var!")
  }

  static func initWithFooBar() -> Test {
    return Test(aVar: "Foo Bar")
  }
}

let test = Test.initWithFooBar()
println(test.aVar) // Prints: "Foo Bar"

initWithSomething 是一种 Objective-C 风格,它不会像 Swift 中那样工作。

在Swift中,所有的初始值设定项都被调用init并且可以选择性地接受一些参数。

您可以使用这样的默认值:

class Example {
    var aVar: String

    init(goodVar : String = "Good Var!") {
        aVar = goodVar
    }
}

let example1 = Example()
println(example1.aVar) // prints "Good Var!"

但是,这种方法不会像您的示例中那样完全起作用,因为一旦您引入了第二种 init 方法,您想要的方法就不明确了:

class Example {
    var aVar: String

    init(goodVar : String = "Good Var!") {
        aVar = goodVar
    }

    init(fooBar : String = "Foo Bar") {
        aVar = fooBar
    }
}

let example1 = Example() // error: cannot invoke initializer…

更好的方法可能是使用 Swift 的 enum:

class Example {
    enum ExampleType : String {
        case GoodVar = "Good Var!"
        case FooBar = "Foo Bar"
    }

    var aVar: String

    init(type : ExampleType) {
        aVar = type.rawValue
    }
}

let example1 = Example(type: .GoodVar)
println(example1.aVar) // "Good Var!"

let example2 = Example(type: .FooBar)
println(example2.aVar) // "Foo Bar"

这种方法将提供您使用普通 Swift 语法所需的灵活性。