【问题标题】:Tuple vs Dictionary differences元组与字典的区别
【发布时间】:2023-03-08 17:49:02
【问题描述】:

有人可以解释一下元组和字典之间的主要区别是什么以及何时在 Swift 中使用哪个?

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    主要区别:

    • 如果您需要从一个方法返回多个值,您可以使用元组。
    • 元组不需要像 Dictionary 这样的任何键值对。
    • 元组只能包含预定义数量的值,在字典中没有这样的限制。
    • 元组可以包含具有不同数据类型的不同值,而字典一次只能包含一个数据类型值
    • 元组对于从函数返回多个值特别有用。字典可以用作模型对象。

    元组有两种类型:

    1 个命名元组

    在命名元组中,我们为每个元素分配单独的名称。

    定义如下:

    let nameAndAge = (name:"Midhun", age:7)
    

    访问以下值:

    nameAndAge.name
    nameAndAge.age
    

    2 未命名元组

    在未命名的元组中,我们不为其元素指定名称。

    定义如下:

    let nameAndAge = ("Midhun", 7)
    

    访问以下值:

    nameAndAge.0
    nameAndAge.1
    

    let (theName, thAge) = nameAndAge
    theName
    thAge
    

    参考:

    元组

    元组使您能够创建和传递值分组。你 可以使用元组从函数中返回多个值作为单个值 复合值。

    您可以在Swift Programming Language 中查看有关 Tuple 的更多信息

    字典

    字典是存储多个相同值的容器 类型。每个值都与一个唯一键相关联,该键充当 字典中该值的标识符

    您可以在Swift CollectionTypes查看更多关于字典的信息

    【讨论】:

      【解决方案2】:
      • 元组是完全预定义的:它只能具有您为其预定义的值的名称和数量,尽管它们可以是不同的值类型,并且它们没有有名字。并且名称是文字。

      • 字典可以有任意数量的键值对,one 值类型。并且可以通过变量来引用键。


      这是一个元组(带有名称):

      typealias MySillyTuple = (theInt:Int, theString:String)
      

      就是这样。有一个称为theInt 的Int,一个称为theString 的String,这正是它必须具有的,不多也不少。通过名称访问值的唯一方法是使用文字:t.theInt。如果你有一个字符串"theInt",你不能用它来访问t.theInt

      这是一本字典:

      var d = [String:String]()
      

      现在d 可以有任意数量的键,any 键,从无到无数。并且可以使用字符串变量指定键;您不必事先知道密钥是什么。并且所有的值都必须是字符串。

      所以基本上我会说元组与字典完全不同。字典是通过动态键查找的复杂野兽。元组只是一个多于一个值的值。

      【讨论】:

      • 您会建议哪一个作为表格视图的数据源 - myData: (sectionTitle: String, rowTitles: [String])myData: [String: [String]] - 为什么?我更喜欢元组,但这是一个例子,我可以看到为什么会问这个问题。
      • 不要使用tuple 来存储数据,这不是它的用途。通常tableView 的数据源是对象的Array,例如structclass,甚至是Dictionary
      • var d = [AnyHashable:Any]() 怎么样?它可以有任何值类型的值。
      • 这本可以解释得更好
      【解决方案3】:
      1. DictionaryCollection TypeTupleCompound type
      2. DictionaryKey Value 类型,TupleComma separated list of multiple types

      字典:

      var dictionary = ["keyone": "value one", "keytwo": "Value Two"]

      元组:

      let someTuple: (Double, Double, String, (Int, Int)) = (3.14159, 2.71828, "Hello", (2, 3))
      

      【讨论】:

        【解决方案4】:

        字典由键值集组成。一个元组用于传递分组值。

        字典:

        字典是存储多个相同值的容器 类型。每个值都与一个唯一键相关联,该键充当 字典中该值的标识符。

        应该使用字典来创建关联对象的列表。一个例子是玩家及其分数的字典:

        var scoreDictionary = ["Alice" : 100, "Bob" : 700]
        

        元组

        元组将多个值组合成一个复合值。

        应该使用元组来传递值组。它们是similar to arrays,但是是固定长度和不可变的。一个示例使用可能是表示 3 维点的元组:

        var myPoint = (10, 12, 14)
        

        如您所见,在很多情况下您会使用字典,在很多情况下您会使用元组。每个都有其特定的目的。

        【讨论】:

          【解决方案5】:

          元组是复合值,对于从函数返回多个值的函数很有用。例如(来自 Apple 文档):

          func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) {
              var min = scores[0]
              var max = scores[0]
              var sum = 0
          
              for score in scores {
                  if score > max {
                      max = score
                  } else if score < min {
                      min = score
                  }
                  sum += score
              }
          
              return (min, max, sum)
          }
          

          此函数返回一个包含 min、max 和 sum 的元组。这些值可以通过名称或位置访问:

          let statistics = calculateStatistics([5, 3, 100, 3, 9])
          var sum:Int = statistics.sum
          var sum2:Int = statistics.2
          

          字典是“查找”数据类型。它们返回给定键的对象。比如下面的代码:

          let font:NSFont = NSFont(name: "AppleCasual", size: 18.0)!
          let textStyle = NSMutableParagraphStyle.defaultParagraphStyle().mutableCopy() as NSMutableParagraphStyle
          textStyle.alignment = NSTextAlignment.LeftTextAlignment
          let textColor:NSColor = NSColor(calibratedRed: 1.0, green: 0.0, blue: 1.0, alpha: 1.0)
          
          let attribs = [NSFontAttributeName: font,
                  NSForegroundColorAttributeName: textColor,
                  NSParagraphStyleAttributeName: textStyle]
          
          let color = attribs[NSForegroundColorAttributeName]
          
          println("color = \(color)")
          

          将打印:

          颜色 = 可选(NSCalibratedRGBColorSpace 1 0 1 1)

          字典对很多事情都很有用,并且是某些功能所必需的。例如(在上面的代码之后):

          let testString:NSString = "test String"
          var img:NSImage = NSImage(size: NSMakeSize(200,200))
          img.lockFocus()
          testString.drawAtPoint(NSMakePoint(0.0, 0.0), withAttributes: attribs)    
          img.unlockFocus()
          

          在这段代码中,drawAtPoint 使用字典属性来查找它需要的参数。参数不需要按任何特定顺序排列,因为 drawAtPoint 将使用正确的键查找所需的值。

          字典和元组相似,但不完全相同。在上面的代码中,字典返回了一个 Optional 类型:Optional(NSCalibratedRGBColorSpace 1 0 1 1)

          如果我们为了同样的目的使用一个元组:

          var attribTuple = (font:NSFont(name: "AppleCasual", size: 18.0), color:NSColor(calibratedRed: 1.0, green: 0.0, blue: 1.0, alpha: 1.0))
          
          println("tupleColor = \(attribTuple.color)")
          

          打印:

          tupleColor = NSCalibratedRGBColorSpace 1 0 1 1

          不是字典的可选类型。

          【讨论】:

            【解决方案6】:

            元组是固定长度的东西。您不能向元组添加额外元素或删除一个元素。一旦你创建了一个元组,它就有相同数量的元素——var t = (1,2) 的类型是(Int,Int)。它永远不会变成(1,2,3),你最多只能把它改成(7,8)。这都是在编译时固定的。

            您可以像这样通过它们的数字位置访问元素

            t.0 + t.1  // with (1,2), would equal 3
            t.0 = 7
            

            数组是可变长度的:您可以从数组var a = [1,2] 开始,然后通过a.append(3) 添加一个条目以使其成为[1,2,3]。你可以用a.count 告诉你有多少项目。您可以通过下标访问/更新元素:a[0] + a[2] // equals 4

            您可以在元组中命名元素:

            var n = (foo: 1, bar: 2)
            

            那么你可以使用这些名字:

            n.foo + n.bar  // equals 3
            

            这并没有消除按位置访问它们的能力:

            n.0 + n.1  // equals 3 
            

            但是这些名字,一旦设置,就和长度一样在编译时固定:

            n.blarg  // will fail to compile
            

            这与字典不同,字典(如数组)可以增长或缩小:

            var d = [“foo”:1, “bar”:2]
            d[“baz”] = 3; 
            d[“blarg”] // returns nil at runtime, there’s no such element    
            

            【讨论】:

              猜你喜欢
              • 2011-10-01
              • 2017-12-30
              • 1970-01-01
              • 1970-01-01
              • 2012-03-14
              • 2015-10-17
              • 2016-03-22
              • 2017-12-03
              • 2017-04-03
              相关资源
              最近更新 更多