【问题标题】:Type Alias Declaration with templates in Swift在 Swift 中使用模板键入别名声明
【发布时间】:2017-05-10 14:49:39
【问题描述】:

如何避免在函数f0f1、...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) { }

?

【问题讨论】:

    标签: swift templates generics


    【解决方案1】:

    我不确定您是否可以完全按照您的要求进行操作。类型别名是可以用来代替现有类型的符号,它不是限制模式。

    您可以通过在类定义中添加额外的通用占位符类型 (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]>()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-08
      • 1970-01-01
      • 2019-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多