我试图将一个元组(例如,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)
}
......但是没有把它弄好。
有什么想法吗? ...溶液
答案 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)]