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?