2015-05-30 26 views
6

mi mümkün, evet, nasıl böyle bir Sınıfında parametresi olmadan birden init var (dize sadece bir exemple ise) eğer:nasıl Swift ile birden init() sahip

aVar: String 

init() { 
    aVar = "simple init" 
} 

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

initWithFooBar() { 
    aVar = "Foo Bar" 
} 
+0

Belki de "kolaylık init" bir göz atın: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html#//apple_ref/doc/uid/ TP40014097-CH18-ID215 – grominet

cevap

4

verilen bağımsız değişken ile çağrılır kullanın. Alternatif olarak başlangıç ​​değerlerini init yöntemine geçirebilirsiniz. Sorunuzun gelen örneğini alarak:

class MyClass { 
    var myString: String 

    init(myString: String) { 
     self.myString = myString 
    } 
} 

let a = MyClass(myString: "simple init") 

Veya myString sadece belirli değerler olması gerekiyordu, sen kullanabilirsiniz bir 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" 
+0

Bu sınıf için 'extension' kullanımıyla bir sınıf için birden fazla 'init' yapabiliriz ve 'init' içindeki 'init' özelini tanımlayabiliriz –

0

Sen olabilir Eğer sınıfın yeni bir örneğini oluşturmak farklı parameters.When farklı init, init yöntemi belirsiz olacağından sen istediğini init yöntem parametreleri olmadan birden init s olamaz sen

+0

Mmm, bu initWithParam (aGoodVar: Bool, fooBar: Bool) 'a göre aşağıdaki gibi yazmayı düşünmeme izin verin ve başlatmayı başlatın, ama bu temiz değil, değil mi? Özellikle 10+ parametrem varsa. – grominet

+0

@grominet sadece sınıfın başlatılması için init kullanabilirsiniz. –

+0

işlevinin bir işlevi gibi görülemez, init ile mümkün olmayabilir, ancak geçen argümanı, ihtiyacım olan her zamandan önce nesneyi oluşturmam için zorlayacağım. Ve bir işlevle, başlatma işlevini kaçırma riskini sağlar. – grominet

2

Its mümkün değildir aynı alarak birden init olması (ya da hayır) params.

Ama önceden tanımlanmış devletlerle nesneleri oluşturmak için bir yol arıyorsanız şunu kullanabilirsiniz statik fabrika yöntemleri:

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

initWithSomething bir Objective-C tarzı olduğunu ve tam olarak böyle gitmez Swift'de.

Swift'de, tüm başlatıcılar init olarak adlandırılır ve isteğe bağlı olarak bazı parametreler alabilir.

Böyle varsayılan değerleri kullanabilirsiniz: Eğer ikinci init yöntemini tanıtmak kez nedeniyle

class Example { 
    var aVar: String 

    init(goodVar : String = "Good Var!") { 
     aVar = goodVar 
    } 
} 

let example1 = Example() 
println(example1.aVar) // prints "Good Var!" 

Ancak bu yaklaşım, sizin örnekte olduğu gibi tam olarak çalışmaz, bu istedik hangi Belirsiz:

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" 
0:
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… 

daha iyi bir yaklaşım Swift adlı enum kullanmak olabilir

Bu yaklaşım, normal Swift sözdizimini kullanarak istediğiniz esnekliği sağlayacaktır.