如何使用Swift实现多个init()函数

9

是否有可能在类中使用多个无参数的init方法,如果可以,怎么做(字符串只是一个例子):

aVar: String

init() {
   aVar = "simple init"
}

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

initWithFooBar() {
   aVar = "Foo Bar"
}

也许可以在这里看一下“convenience init”:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html#//apple_ref/doc/uid/TP40014097-CH18-ID215 - grominet
4个回答

6

您不能使用没有参数的多个init方法,因为这会使得无法确定您想要使用哪个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"

1
我们可以使用类的extension并在其中定义特定的init,从而为一个类拥有多个init - Samarth Kejriwal

4

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语法,为您提供所需的灵活性。

这是一个非常聪明的解决方案(枚举)。 - John Pitts

2

不可能有多个init函数,可以使用相同的参数(或没有参数)。

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

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"

1
你可以使用不同的参数来创建不同的初始化。当你创建一个类的新实例时,init方法将使用你传递的参数被调用。

嗯,这让我想到可以像这样编写init: initWithParam(aGoodVar: Bool, fooBar: Bool),并根据参数启动初始化,但这似乎不够简洁,对吧?特别是如果我有10个以上的参数。 - grominet
@grominet 你只能使用init来初始化类。它被视为一个函数。 - Stefan Scoarta
也许在初始化时不可能实现,但传递参数将迫使我在每次需要它之前创建对象。而通过函数,它会让错过启动函数的风险增加。 - grominet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接