如何使用Swift多个init()

时间:2015-05-30 19:44:42

标签: swift init

是否有可能,如果是的话,如何在没有参数的情况下使用多个init,在这样的类中(字符串只是一个例子):

SELECT * FROM (
    SELECT 
        year(invoiceDate) as [year],left(datename(month,invoicedate),3)as [month], 
    InvoiceAmount as Amount 
FROM Invoice
) as s
PIVOT
(
    SUM(Amount)
    FOR [month] IN (jan, feb, mar, apr, 
    may, jun, jul, aug, sep, oct, nov, dec)
)AS pivot

4 个答案:

答案 0 :(得分:4)

你不能有多个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 :(得分: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"

答案 2 :(得分:2)

init是一种Objective-C风格,它与Swift中的风格完全不同。

在Swift中,所有初始值设定项都称为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… 方法,它就会变得模糊不清:

enum

更好的方法可能是使用Swift的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"

{{1}}

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

答案 3 :(得分:0)

您可以使用不同的参数创建不同的init。当您创建类的新实例时,将使用您传入的参数调用init方法