如何将元组添加到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)]