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.