2016-03-29 25 views
2

Protokolün genel dizisini kullanmanın bir yolu var mı? Örneğin , Swift sınıfındaki protokol dizisini kullanma 'generic

/* I want to use protocol like below, 
* but I can't because protocol is not concrete 
* so cannot make array of it */ 
class MyClass<T where T:MyProtocol, T:[MyProtocol]> { 
    let result: T 
} 

protocol MyProtocol { 
    init(with: String) 
} 

class SpecialThing: MyProtocol { 
    let appleWatch: AppleWatch 

    init(with: String) { 
     self.appleWatch = AppleWatch(with) 
    } 
} 

class SampleClass { 
    func test { 
     typealias listCallback = (MyClass<[SpecialThing]>, NSError) ->() 
     typealias oneCallback = (MyClass<SpecialThing>, NSError) ->() 
    } 
} 

bir nesne veya protokol alt sınıfına ait dizi olabilir. Sanırım "typealias" bana yardım etmiyor.

Bununla

+0

Ben genel tür T MyProtocol ve dizisi olarak belirtilen sahip olmak mümkündür sanmıyorum MyProtocol aynı zamanda. – Lachezar

+0

Sanırım öyle. MyClass'ta genel nesneyi başlatmak istiyorum. Her şeyi araştırdı ama hala çözüm bulamıyor. – macaron

+0

Bildiğim kadarıyla mümkün değil. Oldukça bariz ama bildiğim tek “çözüm”, sınıf MyClass { sonuç verir: [T] } ' –

cevap

1

Benim ilk konu tipi imzası yanlış olmasıdır ..... şey daha basit bir yol bulmak istiyoruz:

yapıyor bir şey aynı tür var
class MyClass<T where T:MyProtocol, T:[MyProtocol]> 

: bir kere MyProtocol olarak tekrar MyProtocol bir dizi olarak, T yeniden tanımlıyor çünkü

let t: String 
let t: [String] 
t = String("foo") 

derleyici şikayet. İkisine sahip olamazsın, sadece bir tane alabilirsin.

0

Cevap: kullanın yapı gibi Either:

enum Either<T, U> 
{ 
    case Left(T) 
    case Right(U) 

    var leftValue: T? 
    { 
     if case .Left(let leftValue) = self 
     { 
      return leftValue 
     } 

     return nil 
    } 

    var rightValue: U? 
    { 
     if case .Right(let rightValue) = self 
     { 
      return rightValue 
     } 

     return nil 
    } 
} 

gözetilmesi:

class MyClass<T: MyProtocol> 
{ 
    let result: Either<T, [MyProtocol]> 
}