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

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

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

我得到的是:

无法find接受提供的参数的“+ =”的重载

提示:我试图对每个参考书中的“+ =”进行重载:

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

…但没有得到它的权利。

有任何想法吗? …解?

由于这仍然是在谷歌添加元组到数组的最好的答案,值得注意的是事情已经在最新版本中稍微改变。 即:

当声明/实例化数组时; 该types现在嵌套在括号内:

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

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

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

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

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

你有两个问题。 第一个问题,你不是创build一个“元组数组”,你正在创build一个“可选的元组数组”。 要解决这个问题,改变这一行:

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

至:

 var myStringArray: (String,Int)[] 

其次,你正在创build一个variables,但没有给它一个价值。 你必须创build一个新的数组并将其分配给variables。 要解决这个问题,在第一个之后加上这一行:

 myStringArray = [] 

…或者你可以把第一行改为:

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

之后,这条线路运行良好,你不必担心运营商或其他疯狂的超载。 你完成了!

 myStringArray += ("One", 1) 

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

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

如果你删除可选,它工作正常,否则你将不得不这样做:

 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) 

由于这个问题,我已经多次在这里结束了。 仍然不像我想追加到一个元组数组。 这里是我现在如何做的一个例子。

为元组设置一个别名 – 关键点

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

空arrays

 var allRegionDetails = [RegionDetail]() 

现在很容易添加

 var newRegion = RegionDetail(newRegionName, constraints) allRegionDetails.append(newRegion) var anotherNewRegion = RegionDetail("Empty Thing", nil) allRegionDetails.append(anotherNewRegion) 
  @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) 

注意:如果你这样做,那就不行了:

 array += tuple 

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

 array += [tuple] 

我认为苹果改变这种表示,因为它更合乎逻辑

感谢意见:

 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)") } } 

输出:

有趣的数字:[Square:[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

arrays的混合物:

(square,1),(square,4),(square,9),(square,16),(square,25),(prime,2),(prime,3)myStringArray (Prime,5),(Prime,7),(Prime,11),(Prime,13),(Fibonacci,1), Fibonacci,5),(Fibonacci,8)]