微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过符合Swift 2中的协议来扩展类型化数组

我想扩展一个类型化数组Array< SomeType>这样它符合协议SomeProtocol.现在我知道你可以扩展一个类型化的数组,如下所示:

extension Array where Element: SomeType { ... }

您还可以扩展对象以符合如下协议:

extension Array: SomeProtocol { ...  }

但我无法弄清楚使用类型数组符合协议的正确语法是什么,例如:

extension (Array where Element: SomeType): SomeProtocol { ... }

任何Swift 2专家都知道如何做到这一点?

解决方法

您不能将大量逻辑应用于一致性.它要么符合要么不符合要求.但是,您可以对扩展应用一些逻辑.下面的代码可以轻松设置一致性的特定实现.哪个是重要的部分.

稍后将其用作类型约束.

class SomeType { }

这是你的协议

protocol SomeProtocol {

    func foo()

}

这是协议的扩展.在SomeProtocol的扩展中实现foo()会创建一个认值.

extension SomeProtocol {

    func foo() {
        print("general")
    }
}

现在,Array使用foo()的认实现符合SomeProtocol.所有数组现在都将foo()作为一种方法,这不是超级优雅的.但它没有做任何事情,所以它不会伤害任何人.

extension Array : SomeProtocol {}

现在很酷的东西:
如果我们使用Element的类型约束创建Array的扩展,我们可以覆盖foo()的认实现

extension Array where Element : SomeType {
    func foo() {
        print("specific")
    }
}

测试:

let arrayOfInt = [1,2,3]
arrayOfInt.foo() // prints "general"

let arrayOfSome = [SomeType()]
arrayOfSome.foo() // prints "specific"

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐