是否有可能,如果是的话,如何在没有参数的情况下使用多个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
答案 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方法