如何将数组转换为元组?

26

我只想在Swift中将数组转换为元组,类似于以下内容:

>>> myArray = [1,2,3,4,5]
>>> mytuple = tuple(myArray)
>>> mytuple
(1, 2, 3, 4, 5)

怎么样是最简单的方法呢?

(我今天才开始学习Swift,所以我非常非常新手)。

5个回答

26

如果你愿意进行一些底层魔法操作,这实际上是完全可能的。不过,我认为如果元组具有集合类型,那么它就不起作用了。这主要是用于与C库进行交互。

typealias TupleType = (UInt8, UInt8, UInt8)

var array = [2, 3, 4] as [UInt8]
var tuple = UnsafeMutablePointer<StepsType>(malloc(UInt(sizeof(TupleType))))
memcpy(tuple, array, UInt(array.count))

更多相关的内容可在此处找到:https://codereview.stackexchange.com/questions/84476/array-to-tuple-in-swift/84528#84528


因为我们中有70%是高度视觉化的生物:

enter image description here


16
由于元组的大小是其类型的一部分,而对于数组来说并非如此,因此您无法这样做。如果您知道数组的长度,您可以使用let myTuple = (myArray [0],myArray [1],...)。或者你可以从一开始就围绕元组构建你的架构。您想要做什么?
这是在许多其他语言中经常出现的问题。请参见如何在Haskell中将列表转换为元组?

1
不是想要构建任何东西,只是好奇。感谢您的帮助。 - niranjanbajgai

3
如果你想从数组中同时提取多个值,以下代码可能会有帮助。
extension Array {
    func splat() -> (Element,Element) {
        return (self[0],self[1])
    }

    func splat() -> (Element,Element,Element) {
        return (self[0],self[1],self[2])
    }

    func splat() -> (Element,Element,Element,Element) {
        return (self[0],self[1],self[2],self[3])
    }

    func splat() -> (Element,Element,Element,Element,Element) {
        return (self[0],self[1],self[2],self[3],self[4])
    }
}

那么你可以像这样使用它。
  let (first,_,third) = ( 0..<20 ).map { $0 }.splat()

你可以编写代码生成器来生成扩展代码。

2

这是我通用的将数组数据复制到元组的解决方案。唯一无法解决的问题是检查元组中的元素类型和数组中的元素类型是否匹配。

原始答案:Original Answer

/// Unsafe copy array to tuple
func unsafeCopyToTuple<ElementType, Tuple>(array: inout Array<ElementType>, to tuple: inout Tuple) {
    withUnsafeMutablePointer(to: &tuple) { pointer in
        let bound = pointer.withMemoryRebound(to: ElementType.self, capacity: array.count) { $0 }
        array.enumerated().forEach { (bound + $0.offset).pointee = $0.element }
    }
}

1

害怕不安全指针?或者需要支持包含不同类型的元组?

也可以这样实现:

public extension Array {

    public var tuple: Any? {
        switch count {
        case 0:
            return ()
        case 1:
            return (self[0])
        case 2:
            return (self[0], self[1])
        case 3:
            return (self[0], self[1], self[2])
        case 4:
            return (self[0], self[1], self[2], self[3])
        case 5:
            return (self[0], self[1], self[2], self[3], self[4])
        default:
            return nil
     }
 }

因为手打这个可能会有一些错误,所以最好编写测试来确保返回正确的元组。
我在ArrayPlusTuple中使用了这种方法。
所以,与其自己编写这个功能,不如只需将pod 'ArrayPlusTuple'添加到您的pod文件中,就可以免费获得这个经过测试的功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接