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 方法
你不能有多个没有参数的 init
s,因为你想使用哪个 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 语法所需的灵活性。
是否有可能,如果可以,如何在 Class 中有多个不带参数的初始化(字符串只是一个例子):
aVar: String
init() {
aVar = "simple init"
}
initWithAGoodVar() {
aVar = "Good Var!"
}
initWithFooBar() {
aVar = "Foo Bar"
}
您可以使用不同的 init parameters.When 创建您的 class 的新实例,使用您传入的参数调用 init 方法
你不能有多个没有参数的 init
s,因为你想使用哪个 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 语法所需的灵活性。