我可以扩展 Swift 中的元组吗?

Can I extend Tuples in Swift?

我想为 Swift 中的(例如)两个值的元组编写一个扩展。例如,我想写这个 swap 方法:

let t = (1, "one")
let s = t.swap

使得 s 的类型为 (String, Int),值为 ("one", 1)。 (我知道我可以很容易地实现一个 swap(t) 函数,但这不是我感兴趣的。)

我可以这样做吗?我似乎无法在 extension 声明中写出正确的类型名称。

此外,我想答案是一样的,我可以让一个二元组采用给定的协议吗?

您不能在 Swift 中扩展元组类型。 根据 Types,有 命名类型 (其中 可以扩展)和 复合类型 。元组和函数是复合的 类型。

另请参阅(强调):

Extensions
Extensions add new functionality to an existing class, structure, or enumeration type.

正如上面的回答所述,您不能在 Swift 中扩展元组。但是,除了给你一个不,你可以做的是将元组框在 [​​=11=]、structenum 中并扩展它。

struct TupleStruct {
    var value: (Int, Int)
}
extension TupleStruct : Hashable {
    var hashValue: Int {
        return hash()
    }
    func hash() -> Int {
        var hash = 23
        hash = hash &* 31 &+ value.0
        return hash &* 31 &+ value.1
    }
}

func ==(lhs: TupleStruct, rhs: TupleStruct) -> Bool {
    return lhs.value == rhs.value
}

作为旁注,在 Swift 2.2 中,最多包含 6 个成员的元组现在是 Equatable

详情

  • Xcode 11.2.1 (11B500), Swift 5.1

解决方案

struct Tuple<T> {
    let original: T
    private let array: [Mirror.Child]
    init(_ value: T) {
        self.original = value
        array = Array(Mirror(reflecting: original).children)
    }

    func getAllValues() -> [Any] { array.compactMap { [=10=].value } }
    func swap() -> (Any?, Any?)? {
        if array.count == 2 { return (array[1].value, array[0].value) }
        return nil
    }
}

用法

let x = (1, "one")
let tuple = Tuple(x)
print(x)                                        // (1, "one")
print(tuple.swap())                             // Optional((Optional("one"), Optional(1)))
if let value = tuple.swap() as? (String, Int) {
    print("\(value) | \(type(of: value))")      // ("one", 1) | (String, Int)
}