Скажите, что у вас
class Fancy:UIView
вы хотите найти все представления sibling Fancy
. Нет проблем...
for v:UIView in superview!.subviews
{
if let f = v as? Fancy
{ f.hungry = false }
}
Итак, попробуйте расширение,
public extension UIView
{
internal func fancySiblings()->([Fancy])
{
return (self.superview!
.subviews
.filter { $0 != self }
.flatMap { $0 as? Fancy }
)
}
}
Удивительно, теперь вы можете
for f:Fancy in self.fancySiblings()
{ f.hungry = false }
Фантастические.
Но,
Как обобщать это расширение для работы с любым подтипом UIView?
В идеале, может ли расширение вывести тип, даже? Как и тип?
Итак, что-то вроде...
public extension UIView
{
internal func siblings<T>( something T )->([T])
{
return (self.superview!
.subviews
.filter { $0 != self }
.flatMap { $0 as? T }
)
}
и тогда вы могли бы назвать это чем-то вроде этого...
for f in self.siblings(Fancy)
for p in self.siblings(Prancy)
for b in self.siblings(UIButton)
Как вы можете "рассказать" об общем расширении типа, который используется, например?
Кажется, вы можете "вывести его назад",
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()
Что удивительно, но не работает по-другому.
Вы можете даже...
self.siblings().forEach{
(f:Fancy) in
d.hasRingOn = false
}
Поэтому мне все равно хотелось бы знать, как "пройти" тип, похожий на for f in self.siblings(Fancy)
, и, в идеале, даже вывести его также.