【问题标题】:Can I use an or ( || ) in a where clause?我可以在 where 子句中使用 or ( || ) 吗?
【发布时间】:2017-07-18 11:19:04
【问题描述】:

我正在尝试扩展Array 类型,但我只希望类型为IntFloat 的函数可用。

我知道我可以为一种类型做到这一点:

extension Sequence where Iterator.Element == Int { }

但是我可以为多种类型执行此操作吗?这就是我想要的:

extension Sequence where Iterator.Element == Int || Iterator.Element == Float { }

有可能做到这一点吗?

【问题讨论】:

    标签: swift generics types where


    【解决方案1】:

    这在概念上实际上是行不通的。在扩展中使用 where 允许您使用 Element 作为您指定的类型。如果你说它可以是多个类型,你可能根本没有 where 说明符。

    如果您希望为多种类型添加特定功能,我建议您创建一个空协议并添加对所需类型的遵守。例如:

    protocol WorksWithExtension { }
    
    extension Int: WorksWithExtension { }
    extension Float: WorksWithExtension { }
    
    extension Sequence where Iterator.Element: WorksWithExtension {
        //Do whatever you need to do here
    }
    

    【讨论】:

    • 我希望库的用户为一组受限的接口注册他们自己的实现。我想在我的库中为他们提供一个通用的“注册”方法,该方法被限制为只接受实现一组允许协议之一的泛型类型。 register 函数不调用任何特定方法,只是使用类型本身在底层 DI 系统中相应地注册它们。所以......问题仍然存在
    • @RaduSimionescu 在这种情况下,您将/应该使用封装您希望您的协议集实现的接口的协议,并且(可选地)使该接口成为您的一组接口的父接口。所以......答案仍然存在;-)
    • 当然,我想到了——实际上这是我的第一个方法。但是,使用这种方法,您无法在该顶级协议中定义任何类型的合约,这使得它毫无用处。问题是 swift 是否允许“或”,而不是在哲学上是否正确
    • 为什么不能定义合约?如果您希望遵循的类型做某事,只需添加一个声明以说明他们可以做那件事。否则编译器将不得不检查整个类型的接口(包括所有扩展)以获取公共签名,或者只是传递消息并可能在运行时崩溃。第一个不切实际,第二个违背了 Swift 的设计理念。
    猜你喜欢
    • 2017-05-07
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多