【发布时间】:2016-05-15 15:25:45
【问题描述】:
说你有
class Fancy:UIView
您想查找所有同级Fancy 视图。 No problem...
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) 之类的类型,理想情况下,甚至还可以推断它。
【问题讨论】:
-
类似问题:stackoverflow.com/questions/37216240/…(如果您认为它不能回答您的问题,那没关系 - 但这是同一个潜在问题)。
标签: ios swift generics functional-programming swift-extensions