Скажи, что у тебя есть
class Fancy:UIView
вы хотите найти все родственные 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)
и, в идеале, даже вывести его.