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

时间:2015-02-04 09:18:35

标签: swift tuples swift-extensions swift-protocols

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

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

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

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

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

3 个答案:

答案 0 :(得分:29)

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

另见(重点补充):

  

Extensions
  扩展程序为现有功能添加新功能   类,结构或枚举类型

答案 1 :(得分:5)

正如上面的答案所述,你不能在Swift中扩展元组。但是,您可以做的就是将元组放在<Compile Include="MainForm.ContextActions.cs" /> <Compile Include="MainForm.ContextActions.cs"> <DependentUpon>MainForm.cs</DepedentUpon> </Compile> class内并扩展它。而不仅仅是给你一个否,你可以做的就是把它组合起来。

struct

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

答案 2 :(得分:0)

详细信息

  • 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 { $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)
}