2016-05-14 11 views
2

Ich habe einenFinden Ansichten der Klasse Geschwister in Swift

class Fancy:UIButton 

und ich möchte alle Geschwister Ansichten finden, die die gleiche Klasse.

Ich mache das

for v:UIView in superview!.subviews 
    { 
    if v.isKindOfClass(Fancy) 
     { 
     // you may want... if (v==self) continue 
     print("found one") 
     (v as! Fancy).someProperty = 7 
     (v as! Fancy).someCall() 
     } 
    } 

es zuverlässig in Tests scheint zu funktionieren (keine Geschwister, viele, etc)

Aber es gibt eine Menge von "!" da drin.

Ist das der richtige Weg in Swift?


BTW hier ist eine coole Art, es mit Erweiterungen auf den großen Antworten unter

Pass in a type to a generic Swift extension, or ideally infer it

+0

Force-Unwrapping ist gefährlich und sollte vermieden werden .. Wenn es fehlschlägt, stürzt man ab. Deine innere Kraft-Auspacken '(v wie! Fancy)' ist sicher, aber unelegant. –

+0

Hi @DuncanC, du bist ziemlich sicher, dass es sicher ist ?? (Unelegant wir können später damit umgehen :)) – Fattie

+0

Der innere Teil ist Kraft-Down-Casting, nicht Kraft-Unwrapping. Ich habe falsch gesprochen. Und ja, es ist sicher, da Sie es in einer if-Anweisung haben, die die Klasse von v überprüft –

Antwort

4

Was Basis zu tun:

for v in superview!.subviews 
{ 
    if let f = v as? Fancy{ 
     print("found one") 
     f.someProperty = 7 
     f.someCall() 
    } 
} 
+0

Versuchen Sie 'for v in superview? .subviews ?? [] 'um das letzte'! 'loszuwerden. –

+0

Auch 'wenn f = v wie? Stellen Sie sich vor, wo f! = Self ist, wenn Sie "self" überspringen möchten. –

+0

Ich fühle, dass dies die einfachste, nicht allzu prägnante, nicht allzu wortwörtliche Swift-Idiom-Antwort ist. Danke nochmal an alle. – Fattie

1

Oder diese:

if let views = superview?.subviews 
{ 
    for aView in views 
    { 
    if let fancyView = aView as? Fancy 
    { 
     fancyView.someProperty = 7 
     fancyView.someCall() 
    } 
    } 
} 

@RobMayoff hat einen guten Punkt über das Ausschließen von Selbst. Der Code sollte wirklich sein:

if let views = superview?.subviews 
{ 
    for aView in views 
    { 
    if let fancyView = aView as? Fancy where fancyView != self 
    { 
     fancyView.someProperty = 7 
     fancyView.someCall() 
    } 
    } 
} 
+0

Ich persönlich mag die funktionale Version von @ appzYourLife, aber Sie sollten * eine * von ihnen akzeptieren. –

+0

es ist sehr schade, dass man nicht schreiben kann, sozusagen: 'for aView as? Fancy in views – Fattie

+0

Sie wollen also eine for-Schleife mit einem "wie?" Um einen impliziten Filter zu machen? Das wäre praktisch. –

6

Was ist mit funktionalen Programmierung?

self.superview? 
    .subviews 
    .flatMap { $0 as? Fancy } 
    .filter { $0 != self } 
    .forEach { fancy in 
     fancy.someProperty = 4 
     fancy.someMethod() 
    } 
+0

Diese Antwort ist mein Favorit. (gewählt.) Ich muss mir selbst beibringen, im funktionalen Programmierstil zu denken. –

+0

@DuncanC: Danke, das weiß ich zu schätzen. –

+0

macht eine schöne Erweiterung! http://stackoverflow.com/questions/37240091/pass-in-a-type-to-a-generic-swift-extension – Fattie

Verwandte Themen