Передайте тип универсальному расширению Swift или, в идеале, сделайте вывод
Скажи у тебя есть
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)
и, в идеале, даже сделать вывод, что это тоже.