2014-07-03 9 views
9

Hallo, ich verwende Generika viel in meinem aktuellen Projekt. Ich bin jedoch auf ein Problem gestoßen:Wie ein generischer Typ erforderlich ist, implementieren Sie ein generisches Protokoll mit einem bestimmten Typ im Protokoll

Ich brauche eine generische Funktion foo<T> um in der Lage zu sein, einen Parameter zu nehmen, der einem generischen Protokoll mit einem bestimmten Typ entspricht.

Zum Beispiel in Java kann ich tun:

public interface Proto<B> { 
    public void SomeFunction() 
} 
public class SampleClass { 
} 
public class Conforms extends Proto<SampleClass> { 
    @Override 
    public void SomeFunction() {} 
} 
public class TestingClass { 
    public void Requires (Proto<SampleClass> param) { 
     // I can use param 
    } 
} 

Wie würde ich die gleiche Requires() Funktion in Swift zu tun? Ich weiß in Swift verwenden Sie typealias im Protokoll für Generika. Wie beschränke ich einen Parameter basierend auf dem typealias?

+0

bezogen werden kann: http://stackoverflow.com/questions/24231498/swift-require-type-and-protocol-for-method-parameter –

Antwort

14

Prototypen scheinen nicht Generika zu haben, die Art und Weise Klassen und Strukturen in Swift zu tun, aber Sie können Typen mit typealias verknüpft haben, die in der Nähe sind.

Sie können Typbeschränkungen verwenden, um sicherzustellen, dass das übergebene Objekt die Proto mit Typeinschränkungen annimmt. Um die Proto Sie in require haben Sie die richtige B, verwenden Sie where.

Apples documentation on generics hat eine Menge Informationen.

This blog post ist auch eine gute Quelle für Informationen über kompliziertere Dinge mit Generika.

protocol Proto { 
    typealias B 
    func someFunction() 
} 

class SampleClass {} 

class Conforms : Proto { 
    typealias B = SampleClass 
    func someFunction() { } 
} 

class TestingClass { 
    func requires<T: Proto where T.B == SampleClass>(param: T) { 
     param.someFunction() 
    } 
} 
+0

Beachten Sie, dass Swift (von der Fachhochschule für harte Klopfzeichen) ab Beta 5 die where-Klausel für zugeordnete Typen nicht überprüfen kann, was zu Laufzeitfehlern führt, wenn Sie oben "requires()" aufrufen, mit einer Instanz von "AnotherSampleClass" (gemeldet) zu Apple) –

7

Sie können eine where-Klausel verwenden, um mehrere Anforderungen für ein generisches Objekt anzugeben. I denke Ihr Beispiel übersetzt dies, aber es stürzt Xcode ab. Beta!

protocol Proto { 
    func someFunction() 
} 
class SampleClass { 
} 
class Conforms: SampleClass, Proto { 
    func someFunction() { 
    } 
} 
class TestingClass { 
    func requires<T: SampleClass >(param: T) where T: Proto { 
     param.someFunction() // it's this line that kills Xcode 
    } 
} 

let testingClass = TestingClass() 
let conforms = Conforms() 
testingClass.requires(conforms) 
+0

die akzeptierte Antwort –

+0

Arbeiten in Xcode 7.1 Dies sollte. 1, 7.2. – SwiftArchitect

Verwandte Themen