有没有办法将元素/值附加到元组?

时间:2017-10-23 15:31:01

标签: swift tuples

无论如何都要向元组添加新元素吗?

var tuple = (v1: 1,v2: 2)

tuple.v3 = 3 // Error
  

“错误:元组类型的值'(v1:Int,v2:Int)'没有成员'v3'”

4 个答案:

答案 0 :(得分:6)

没有。具有不同数量的元素或不同类型的元素的每个元组在Swift类型系统中表示不同的类型。因此,一旦你创建了一个元组,就不能向它添加元素,因为这会改变元组的类型。

元组及其类型的一些基本示例:

let tupleWithTwoInts = (1,2) //has type (Int,Int)
let tupleWithThreeInts = (1,2,3) //has type (Int,Int,Int)
let tupleWithTwoStrings = ("a","b") //has type (String,String)
let tupleWithIntAndString = (1,"a") //has type (Int,String)
let tupleWithStringAndInt = ("a",1) //has type (String,Int)

即使元素的顺序也会对元组的类型产生影响。

type(of: tupleWithIntAndString) == type(of: tupleWithStringAndInt) //false

答案 1 :(得分:3)

如果你只需要支持一些少量的操作,那么你可以为它编写一个函数。

例如,将2D矢量扩展为3D:

func expand(_ v: (x: Int, y: Int), z: Int) -> (x: Int, y: Int, z: Int) {
    return (x: v.x, y: v.y, z: z)
}

答案 2 :(得分:0)

虽然没有如上所述的将数组转换为元组的可扩展方法,但是如果由于要制作可重用的组件而遇到此问题,并且喜欢可变参数声明可以提供的便利,则可以移动方法主体放入一个采用数组的变量,并让您的可变参数声明成为同一方法的替代包装。

func buttonModels(_ buttonModels: ButtonModel...) {
    self.buttonModels = buttonModels
}

成为:

func buttonModels(_ buttonModels: ButtonModel...) {
    self.buttonModels(buttonModels)
}

func buttonModels(_ buttonModels: [ButtonModel]) {
    self.buttonModels = buttonModels
}

答案 3 :(得分:-3)

在我看来,你正在寻找使用字典,而不是元组。请参阅文档:Tuple

编辑:正如所指出的,如果将元组声明为var并且可用于保存可编辑数据,则元组确实可以是可变的。我的坏!