首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将类型传递给泛型Swift扩展,或者理想情况下推断它

将类型传递给泛型Swift扩展,或者理想情况下推断它
EN

Stack Overflow用户
提问于 2016-05-15 23:25:46
回答 1查看 1.9K关注 0票数 22

说你有

 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)这样的类型,理想情况下,甚至还可以推断它。

EN

回答 1

Stack Overflow用户

发布于 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() {

    }
}

在处理泛型时,您只需在方法的签名中包含泛型类型的一个实例。因此,如果您有使用泛型的参数或返回类型,则不需要传递该类型。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37240091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档