Разница между Словарем и Словарем

Может кто-нибудь объяснить, какие основные отличия между Tuples и Dictionaries есть и когда использовать, что в Swift?

Ответы

Ответ 1

Основное различие:

  • Если вам нужно вернуть несколько значений из метода, вы можете использовать кортеж.
  • Tuple не будет нуждаться в каких-либо парах ключевых значений, таких как Dictionary.
  • Кортеж может содержать только предопределенное количество значений, в словаре нет таких ограничений.
  • Кортеж может содержать разные значения с различным типом данных, словарь может содержать только значение типа данных за раз
  • Кортежи особенно полезны для возврата нескольких значений из функции. Словарь может использоваться как модельный объект.

Существует два типа Tuple:

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

Справка:

Кортеж

Кортежи позволяют создавать и передавать группировки значений. Вы может использовать кортеж для возврата нескольких значений из функции в виде одиночного составное значение.

Вы можете узнать больше о Tuple в языке Swift Programming

Словарь

Словарь - это контейнер, в котором хранятся несколько значений одного и того же тип. Каждое значение связано с уникальным ключом, который действует как идентификатор для этого значения в словаре

Вы можете узнать больше о словаре в Swift CollectionTypes

Ответ 2

  • Кортеж полностью предопределен: он может иметь только имена и количество значений, которые вы предопределили для него, хотя они могут быть разными типами значений, и им не нужно иметь имена. И имена - это литералы.

  • Словарь может иметь любое количество пар ключ-значение одного типа значений. И ключи могут быть переданы через переменные.


Здесь кортеж (с именами):

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

Что это. Существует один Int, называемый theInt, один String, называемый theString, и это именно то, что он должен иметь, не более, не менее. И единственный способ получить доступ к значениям по имени - это буква: t.theInt. Если у вас есть строка "theInt", вы не можете использовать ее для доступа к t.theInt.

Здесь словарь:

var d = [String:String]()

Теперь d может иметь любое количество ключей и любые ключи от одного до газиллиона. И ключи могут быть указаны с использованием строковых переменных; вам не нужно заранее знать, какой ключ будет. И все значения должны быть строками.

В принципе, я бы сказал, что кортеж не похож на словарь. Словарь - это сложный зверь для поиска по динамическим клавишам. Кортеж - это просто значение, которое больше одного значения.

Ответ 3

Словарь состоит из наборов ключей. Кортеж выполняется для передачи сгруппированных значений.

Словари:

Словарь - это контейнер, в котором хранятся несколько значений одного и того же тип. Каждое значение связано с уникальным ключом, который действует как идентификатор для этого значения в словаре.

Для создания списков связанных объектов должен использоваться словарь. Примером может служить словарь игроков и их баллы:

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

кортежи

Кортежи группируют несколько значений в одно составное значение.

Для передачи групп значений следует использовать кортеж. Они похожи на массивы, но являются фиксированными и неизменными. Пример использования может быть кортежем, представляющим трехмерную точку:

var myPoint = (10, 12, 14)

Как вы видите, есть много случаев, когда вы будете использовать словарь и многие случаи, в которых вы бы использовали кортеж. Каждый из них имеет свою специфическую цель.

Ответ 4

  • Dictionary - Collection Type, Tuple - Compound type.
  • Dictionary - тип Key Value, Tuple - Comma 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))

Ответ 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)")

Будет напечатан:

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 будет искать нужные значения, используя правильный ключ.

Словари и кортежи похожи, но не совсем одинаковы. В приведенном выше коде словарь возвращал необязательный тип: Необязательный (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