说你有
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)
这样的类型,理想情况下,甚至还可以推断它。
发布于 2016-08-05 04:21:24
与前面所说的答案类似,但更精简一些,并且不必传递任何内容或遍历多次子视图:
extension UIView {
internal func siblings<T: UIView>() -> [T] {
return superview?.subviews.flatMap {return ($0 == self) ? nil : ($0 as? T) } ?? []
}
}
或者我更喜欢使用可选选项:
internal func siblings<T: UIView>() -> [T]? {
return superview?.subviews.flatMap {return ($0 == self) ? nil : $0 as? T }
}
示例用法:
class ExampleView: UIView {
func getMatchingSiblings(){
let foundSiblings: [ExampleView] = siblings()
}
//or with the for loop in the question:
for item: ExampleView in siblings() {
}
}
在处理泛型时,您只需在方法的签名中包含泛型类型的一个实例。因此,如果您有使用泛型的参数或返回类型,则不需要传递该类型。
https://stackoverflow.com/questions/37240091
复制相似问题