Swift where 子句中的元组
Swift tuple in where clause
我有通用的 class:
class Generic<T> {
var value: T
init(value: T) {
self.value = value
}
}
我想编写扩展方法,仅当 T
是任何类型的 2 个值的元组时才使用,并且此方法 returns 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
子句只接受协议。
我发现实现它的唯一方法是:
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)
我有通用的 class:
class Generic<T> {
var value: T
init(value: T) {
self.value = value
}
}
我想编写扩展方法,仅当 T
是任何类型的 2 个值的元组时才使用,并且此方法 returns 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
子句只接受协议。
我发现实现它的唯一方法是:
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)