Leiten Sie einen Typ an eine generische Swift-Erweiterung weiter oder leiten Sie ihn im Idealfall ab

Sag du hast

 class Fancy:UIView

Sie möchten alle Geschwister findenFancy Ansichten.Kein Proble ...

    for v:UIView in superview!.subviews
        {
        if let f = v as? Fancy
            { f.hungry = false }
        }

So versuchen Sie eine Erweiterung,

public extension UIView
    {
    internal func fancySiblings()->([Fancy])
        {
            return (self.superview!
                .subviews
                .filter { $0 != self }
                .flatMap { $0 as? Fancy }
                )
        }
    }

Awesome, du kannst jetzt

    for f:Fancy in self.fancySiblings()
        { f.hungry = false }

Fantastisch

Aber

Wie kann man diese Erweiterung verallgemeinern, um mit einem UIView-Subtyp zu arbeiten?Ideally, kann die Erweiterungeben Sie den Typ , sogar? Sowie einen Typ nehmen?

So, so etwas wie ...

public extension UIView
    {
    internal func siblings<T>( something T )->([T])
        {
            return (self.superview!
                .subviews
                .filter { $0 != self }
                .flatMap { $0 as? T }
                )
        }

und dann könnte man es so nennen ...

    for f in self.siblings(Fancy)
    for p in self.siblings(Prancy)
    for b in self.siblings(UIButton)

Wie können Sie einer generischen Erweiterung den zu verwendenden Typ "mitteilen"?

Es scheint, Sie können "rückwärts schließen",

public extension UIView
    {
    internal func incredible<T>()->([T])
        {
        return (self.superview!
         .subviews
         .filter { $0 != self }
         .flatMap { $0 as? T }
         )
        }


    for f:Fancy in self.incredible()

    for p:Prancy in self.incredible()

Was toll ist, aber nicht anders funktioniert.

Du kannst sogar..

    self.siblings().forEach{
        (f:Fancy) in
        d.hasRingOn = false
        }

So würde ich immer noch gerne wissen, wie man einen Typ wie @ "übergibt&quofor f in self.siblings(Fancy) und im Idealfall sogar daraus schließen.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage