是否有可能在类中使用多个无参数的init方法,如果可以,怎么做(字符串只是一个例子):
aVar: String
init() {
aVar = "simple init"
}
initWithAGoodVar() {
aVar = "Good Var!"
}
initWithFooBar() {
aVar = "Foo Bar"
}
是否有可能在类中使用多个无参数的init方法,如果可以,怎么做(字符串只是一个例子):
aVar: String
init() {
aVar = "simple init"
}
initWithAGoodVar() {
aVar = "Good Var!"
}
initWithFooBar() {
aVar = "Foo Bar"
}
您不能使用没有参数的多个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"
extension
并在其中定义特定的init
,从而为一个类拥有多个init
。 - Samarth KejriwalinitWithSomething
是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…
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"
不可能有多个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"