【问题标题】:Swift tuple in where clausewhere 子句中的 Swift 元组
【发布时间】:2015-09-23 10:15:06
【问题描述】:

我有通用类:

class Generic<T> {
    var value: T

    init(value: T) {
        self.value = value
    }
}

并且我想编写仅在T 是任何类型的 2 个值的元组时使用的扩展方法,并且此方法返回 Generic 类型的值和 3 个值的新元组。我试过了:

extension Generic {
    func append<A, B, C where T: (A, B)>(c: C) -> Generic<(A, B, C)> {
        return Generic(value: (value.0, value.1, c))
    }
}

但显然这是行不通的,因为where 子句只接受协议。

【问题讨论】:

    标签: swift tuples


    【解决方案1】:

    我发现实现它的唯一方法是:

    class Generic<T> {
        var value: T
    
        init(value: T) {
            self.value = value
        }
    }
    
    protocol Tuple2 {
        typealias A
        typealias B
        var i0: A { get }
        var i1: B { get }
    }
    
    protocol Tuple3: Tuple2 {
        typealias C
        var i2: C { get }
    }
    
    struct Tuple2Impl<A, B>: Tuple2 {
        var i0: A
        var i1: B
    
        init(_ i0: A, _ i1: B) {
            self.i0 = i0
            self.i1 = i1
        }
    }
    struct Tuple3Impl<A, B, C>: Tuple3 {
        var i0: A
        var i1: B
        var i2: C
    
        init(_ i0: A, _ i1: B, _ i2: C) {
            self.i0 = i0
            self.i1 = i1
            self.i2 = i2
        }
    }
    
    extension Generic where T: Tuple2 {
        func append<C>(c: C) -> Generic<Tuple3Impl<T.A, T.B, C>> {
            return Generic<Tuple3Impl<T.A, T.B, C>>(value: Tuple3Impl(value.i0, value.i1, c))
        }
    }
    
    var a = Generic(value: Tuple2Impl("Hello", 256))
    
    print(a.append(3.14).value.i2)
    

    【讨论】:

      猜你喜欢
      • 2020-09-14
      • 2017-04-14
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多