Разница между Словарем и Словарем
Может кто-нибудь объяснить, какие основные отличия между 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