swift - 在 Swift 中使用模板键入别名声明

标签 swift templates generics

如何避免函数 f0, f1, ... f10 中的冗余声明?

class SomeClass<T: UnsignedInteger> {

    func f0<S: Sequence>(sequence: S) where S.Iterator.Element == T { }    
    func f1<S: Sequence>(sequence: S) where S.Iterator.Element == T { }
    ......
    func f10<S: Sequence>(sequence: S) where S.Iterator.Element == T { }
}

如何声明这样的东西:

typealias S = Sequence where S.Iterator.Element == T

func f0(sequence: S) { }
func f1(sequence: S) { }
......
func f10(sequence: S) { }

?

最佳答案

我不确定你是否能完全按照你的要求去做。类型别名是可以用来代替现有类型的符号,它不是限制模式。

您可以通过向类定义添加额外的通用占位符类型 (S) 来将函数类型固定为类声明的类型:

class SomeClass0<T: UnsignedInteger, S: Sequence> where S.Iterator.Element == T {

    func f0(sequence: S) { }
    func f1(sequence: S) { }
}

但这意味着引用类型非常丑陋,除非您可以从 init 等推断类型。

let instance0 = SomeClass0<UInt, [UInt]>()

您仍然可以使用占位符类型在类级别修复序列类型,但省略 UnsignedInteger 占位符,具体取决于您如何使用它:

class SomeClass1<S: Sequence> where S.Iterator.Element: UnsignedInteger {

    typealias T = S.Iterator.Element

    func f0(sequence: S) { }
    func f1(sequence: S) { }

    func f99(number: T) {}
}

let instance1 = SomeClass1<[UInt]>()

关于swift - 在 Swift 中使用模板键入别名声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43895949/

相关文章:

ios - 同步线程中的同步问题

objective-c - 为 Watch OS2 创建扩展委托(delegate)类

c# - 构建 MVC3 EditorFor 模板时有没有办法访问 DataAnnotations?

C++模板语法错误

java - 列表泛型协方差

c# - 从类名创建类列表

ios - 我应该在 iOS 应用程序中将图像保存到本地存储吗?

xcode - 无法使用 xcode 6 beta 5 发送发布数据

c++ - 如何将项目放入具有模板化父类(super class)类型的 vector 中

java - 泛型 <?> 实际上是什么意思?