arrays
  • tuples
  • swift
  • 2014-06-15 37 views 38 likes 
    38

    我想添加一个元组(例如,2项元组)到一个数组中。如何将元组添加到Swift数组?

    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

    不'append()'工作? – nhgrif

    +0

    问题是数组的可选性 –

    +1

    如果尝试重载操作符,该怎么办? – holex

    回答

    93

    由于这仍然是用于添加的元组的谷歌顶部答案至 值得注意的是,在最新版本中,事情发生了轻微的变化。即:

    当声明/实例化数组;类型是现在嵌套在括号内:

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

    化合物赋值操作符,+=,现在用于级联阵列;如果将一个单一的项目,它需要被嵌套在一个数组:

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

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

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

    '追加'技巧使代码看起来更清晰,但也更混乱......背后除了代码清洁之外的任何逻辑? –

    +0

    append()在我添加一个或几个对象,代码可读性...的情况下感觉更有用......复合赋值操作符或用一组数据初始化数组,更适合添加大量对象立刻。 –

    +2

    这给了我在Swift 2.0中的麻烦 - '''调用''中的额外参数'值' – MrBr

    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) 
    
    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) 
    
    8

    你有两个问题。第一个问题,你没有创建一个“元组数组”,你正在创建一个“可选的元组数组”。为了解决这个问题,改变这一行:

    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

    答案中,这一个最简单,最有意义。重写操作符是很少会做的事,因为稍后读取代码的人会说“WTF”。至少在这种情况下,它处于预期的过载范围内。 – zaph

    +1

    @Zaph:是的。因为提问者所做的每个人都走这条路。但当然,提问者感到困惑。这就是他问的原因。 :) –

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

    输出:

    interestingNumbers:[正方形:[1,4,9 ,16,25],总理:[2,3,5,7, 11,13],斐波那契:[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)数量: 14)数量:2
    15)数量:3
    16)数量:5
    17 ) 编号:8



    阵列tupules的:

    myStringArray:[(一,1),(广场,1),(方形,4),(方形,9), (正方形,16 (Prime,7),(Prime,11),(Prime,13),(Fibonacci,1),(方形,25),(总理,2),(总理,3),(总理,5), ,(斐波那契,1), (斐波那契,2),(斐波那契,3),(斐波那契,5),(斐波那契,8)]

    +0

    这仍然无法正常工作。如果你尝试运行它,它会产生一个运行时错误(如果它编译的话),因为你从来没有给'myStringArray'赋一个实际的值。 'nil'并不意味着“一个空阵列”。 '']'。看到我的答案。 –

    +0

    这不是一个元组数组,而是字典。 – Shmidt

    1

    注: 如果你这样做不是工作了 :

    array += tuple 
    

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

    array += [tuple] 
    

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

    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) 
    
    相关问题