19

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

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

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

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

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

4

3 回答 3

37

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

另见(强调):

扩展
扩展向现有的 类、结构或枚举类型添加新功能。

于 2015-02-04T09:55:11.537 回答
6

正如上面的答案所述,您不能在 Swift 中扩展元组。然而,你可以做的不仅仅是给你一个不,你可以做的是将元组装在 aclass中,struct或者enum扩展它。

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.

于 2016-06-20T13:46:25.423 回答
0

细节

  • Xcode 11.2.1 (11B500)、斯威夫特 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 { $0.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)
}
于 2019-11-15T03:40:07.883 回答