2016-10-27 6 views
3

Ich bin in einer Situation, in der ich einen benutzerdefinierten Typ habe, der eine associatedtype enthält. In dem Fall, in dem dies gleich Void ist, möchte ich ein Standardverhalten haben (um die Call-Site bequemer zu machen). Ich habe versucht, das Beispiel zu laufen auf:Erweitern des benutzerdefinierten Typs, bei dem der zugehörige Typ gleich ist Void

protocol FooType { 
    associatedtype T: Any 
    var bar: (String) -> T { get } 
} 

struct Foo<T>: FooType { 
    let bar: (String) -> T 
} 

extension Foo where T == Void { // Compile error: "Same-type requirement makes generic parameter 'T' non-generic". 
    init() { 
     self.bar = { _ in return } 
    } 
} 

Die Idee ist, dass in den Fällen, in denen der generischen Typ Void ist, ist es nicht sinnvoll (in meinem Szenario) in einer Funktion zu übergeben (mit dem Namen bar im Beispiel). Daher möchte ich nur eine Standardimplementierung für diese Funktion in diesem spezifischen Kontext.

Wenn ich versuche, das obige zu tun, bekomme ich die Same-type requirement makes generic parameter 'T' non-generic, die sehr ähnlich klingt, was passiert, wenn man versucht, z.B. der Typ Array, wenn bestimmte Typen enthalten sind. Eine Umgehung dafür ist die Einführung eines Protokolls, aber ich kann das nicht für Void tun. Ist es möglich, das zu tun, was ich will oder ist das momentan eine Einschränkung in Swift 3?

Antwort

1

Ab Swift 3.1 funktioniert der in der Frage geschriebene Code jetzt. Das heißt, das Folgende funktioniert nun wie gewünscht:

protocol FooType { 
    associatedtype T: Any 
    var bar: (String) -> T { get } 
} 

struct Foo<T>: FooType { 
    let bar: (String) -> T 
} 

extension Foo where T == Void { 
    init() { 
     self.bar = { _ in return } 
    } 
} 

let foo = Foo<String>(bar: { (t: String) in return "" }) 
let zoo = Foo<Void>() 
Verwandte Themen