如何将一个元组添加到Swift数组?

时间:2014-06-15 19:03:46

标签: arrays tuples swift

我试图将一个元组(例如,2项元组)添加到数组中。

var myStringArray: (String,Int)[]? = nil
myStringArray += ("One", 1)

我得到的是:

  

找不到' + ='的重载接受提供的   参数


提示:我试图重做' + ='每本参考书:

@assignment func += (inout left: (String,Int)[], right: (String,Int)[]) {
    left = (left:String+right:String, left:Int+right+Int)
}

......但是没有把它弄好。

有什么想法吗? ...溶液

8 个答案:

答案 0 :(得分:116)

由于谷歌仍然是将数组添加到数组中的最佳答案,因此值得注意的是最新版本中的内容略有变化。即:

声明/实例化数组时;该类型现在嵌套在大括号中:

var stuff:[(name: String, value: Int)] = []

复合赋值运算符+=现在用于连接数组;如果添加单个项目,则需要嵌套在数组中:

stuff += [(name: "test 1", value: 1)]

还值得注意的是,在包含命名元组的数组上使用append()时,您可以将要添加的元组的每个属性作为参数提供给append()

stuff.append((name: "test 2", value: 2))

答案 1 :(得分:12)

你有两个问题。第一个问题是,你没有创建一个"元组数组",你正在创建一个可选的元组数组"。要解决此问题,请更改此行:

var myStringArray: (String,Int)[]? = nil

为:

var myStringArray: (String,Int)[]

其次,您正在创建一个变量,但没有给它一个值。您必须创建一个新数组并将其分配给变量。要解决此问题,请在第一行之后添加以下行:

myStringArray = []

...或者您只需将第一行更改为:

var myStringArray: (String,Int)[] = []

在此之后,这条线路工作正常,您不必担心操作员超载或其他疯狂。你完成了!

myStringArray += ("One", 1)

这是完整的解决方案。高达两行,一行甚至没有改变:

var myStringArray: (String,Int)[] = []
myStringArray += ("One", 1)

答案 2 :(得分:3)

如果你删除了可选项,它可以正常工作,否则你必须这样做:

var myStringArray: (String,Int)[]? = nil

if !myStringArray {
    myStringArray = []
}

var array = myStringArray!
array += ("One", 1)
myStringArray = array

你永远不能附加一个空数组,所以你必须在某个时候初始化它。你会在下面的重载运算符中看到我们对它进行了延迟加载,以确保它永远不会为零。

您可以将其压缩为'+ ='运算符:

@assignment func += (inout left: Array<(String, Int)>?, right: (String, Int)) {

    if !left {
        left = []
    }

    var array = left!
    array.append(right.0, right.1)
    left = array

}

然后致电:

var myStringArray: (String,Int)[]? = nil
myStringArray += ("one", 1)

答案 3 :(得分:2)

由于这个问题,我已多次到此为止。仍然不像我喜欢附加到一系列元组那么容易。这是我现在如何做的一个例子。

设置元组的别名 - 关键点

typealias RegionDetail = (regionName:String, constraintDetails:[String:String]?)

清空数组

var allRegionDetails = [RegionDetail]()

现在轻松添加

var newRegion = RegionDetail(newRegionName, constraints)
allRegionDetails.append(newRegion)

var anotherNewRegion = RegionDetail("Empty Thing", nil)
allRegionDetails.append(anotherNewRegion)

答案 4 :(得分:2)

Swift 4 解决方案:

// init empty tuple array
var myTupleArray: [(String, Int)] = []

// append a value
myTupleArray.append(("One", 1))

答案 5 :(得分:1)

注意: 它不再起作用了 如果你这样做:

array += tuple 

你会得到错误 你需要的是:

array += [tuple]

我认为苹果改变了这种表现形式,因为它更符合逻辑

答案 6 :(得分:0)

 @assignment func += (inout left: Array<(String, Int)>?, right: (String, Int)) {
    if !left {
        left = []
    }   
    if left {
        var array = left!
        array.append(right.0, right.1)
        left = array
    }
}

var myStringArray: (String,Int)[]? = nil
myStringArray += ("x",1)

答案 7 :(得分:0)

感谢评论:

import UIKit

@assignment func += (inout left: Array<(String, Int)>?, right: (String, Int)) {
    if !left {
        left = []
    }
    if left {
        var array = left!
        array.append(right.0, right.1)
        left = array
    }
}

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let interestingNumbers = [
            "Prime": [2, 3, 5, 7, 11, 13],
            "Fibonacci": [1, 1, 2, 3, 5, 8],
            "Square": [1, 4, 9, 16, 25],
        ]

        println("interestingNumbers: \(interestingNumbers)\n")
        var largest = 0

        var myStringArray: (String,Int)[]? = nil

        myStringArray += ("One", 1)

        var x = 0

        for (kind, numbers) in interestingNumbers {
            println(kind)
            for number in numbers {
                if number > largest {
                    largest = number
                }
                x++
                println("\(x)) Number: \(number)")
                myStringArray += (kind,number)
            } // end Number
        } // end Kind
        println("myStringArray: \(myStringArray)")
    }
}

输出:

  

有趣的数字:[方:[1,4,9,16,25],Prime:[2,3,5,7,   11,13],Fibonacci:[1,1,2,3,5,8]]

     

方形1)编号:1
2)编号:4
3)编号:9
4)   编号:16
5)编号:25
中文数字6)编号:2
7)   编号:3
8)编号:5
9)编号:7
10)编号:11
  11)编号:13
支斐波那契(12)编号:1
13)编号:   1
14)号码:2
15)号码:3
16)号码:5
17)   编号:8



元组数组:

  

myStringArray:[(One,1),(Square,1),(Square,4),(Square,9),   (Square,16),(Square,25),(Prime,2),(Prime,3),(Prime,5),   (Prime,7),(Prime,11),(Prime,13),(Fibonacci,1),(Fibonacci,1),   (Fibonacci,2),(Fibonacci,3),(Fibonacci,5),(Fibonacci,8)]