Swift: массивы и словари

В Swift есть два типа хранения наборов значений - это Массивы и Словари. Массив и Словарь в Swift реализованы как универсальные коллекции.

Массивы в Swift строго типизированы, и всегда точны по поводу типов которые они могут хранить. Если Вы создали массив из float чисел, то в этот массив нельзя будет вставить значения отличные от float. Массив может быть объявлен как переменная ( с помощью var ) или константа ( с помощью let ). Мы можем не писать тип для массива, который инициализируем с помощью литерала массива, инициализация может быть записана в сокращенной форме.


//инициализация массива содержащего значения типа String
var arrMonth: [String] = ["January", "February", "March"]
// еще одна форма инициализации
var arrMonth = ["January", "February", "March"]
// можно задать пустой массив определенного типа
var emptyInts = [Int]()

// количество элементов в массиве можно узнать с помощью свойства count
println("Count in array: \(arrMonth.count)")

// свойство isEmpty можно использовать в качестве проверки на пустоту массива
if arrMonth.isEmpty {
	println("Is empty.")
} else {
	println("Is not empty.")
}

// свойство append позволяет добавить значение в массив
arrMonth.append("April")

// += еще один способ добавить элементы в массив
arrMonth += ["May", "June"]

// Выведет March
println("Third item: \(arrMonth[2])"

// удаляет последний элемент массива, кроме того сохраняет в lastItem значение этого элемента
let lastItem = arrMonth.removeLast()

// заменит значение в массиве с индексом 0 на September
arrMonth[0] = "September"

// зменения диапазона значений за раз
arrMonth[2...4] = ["May", "June"]

// вставляет элемент внутрь массива по указанному индексу
arrMonth.insert("January", atIndex: 0)

// можно удалить элемент по указанному индексу, при этом возвращается удаленный элемент
let first = arrMonth.removeAtIndex(0)

// инициализатор для создания массива определенного размера, со всеми значениями установленными в указанное значение по умолчанию
var arrInt = [Int](count: 3, repeatedValue: 7)



Массивы в Swift всегда начинаются с 0. Вы можете создать новый массив путем сложения вместе двух существующих массивов соответствующего типа, используя оператор сложения ( +).

Вы можете выполнить итерацию по всему набору значений внутри массива с помощью цикла for-in. Если вам нужен целочисленный индекс каждого значения так же как и самое значение, используйте вместо этого глобальную функцию enumerate для итерации по массиву.

for item in arrMonth {
	println(item)
}

for (index, value) in enumerate(arrMonth) {
	println("Index: \(index) Item: \(value)")
}


Словари в Swift конкретны по отношению к типам ключей и значений которые они могут хранить. Они отличаются от классов NSDictionary и NSMutableDictionary из Objective-C, которые могут использовать любой объект в качестве ключей и значений, и не предоставляют никакой информации о характере этого объекта.


// создаем словарь, где [String: String] задает тип ключа и через : тип значения в словаре
var dicMonth: [String: String] = ["first": "January", "second": "February"]
// [String: String] при записи через литералы можно и не писать
var dicMonth: = ["first": "January", "second": "February"]
// можно создать пустой словарь с заданном типом ключей и значений
var namesOfIntegers = [Int: String]()

// можем добавить элемент в словарь
dicMonth["third"] = "March"

// метод updateValue обновит значение при ключе third и вернет старое значение либо nil если значения не было
let oldValue = dicMonth.updateValue("April", forKey: "third")

// получим значение из словаря для конкретного ключа
if let thirdItems = dicMonth["third"] {
	println("Is \(thirdItems).")
} else {
	println("Is not in dictionary.")
}

// удалим значение для конкретного ключа
dicMonth["third"] = nil

// removeValueForKey метод удаляет пару ключ-значение если она существует и затем возвращает значение , либо возвращает nil если значения не существует
let removedValue = dicMonth.removeValueForKey("third")

// таким способом можно вернуть массив всех ключей или всех значений словаря
let monthCodes = [String](dicMonth.keys)
let monthNames = [String](dicMonth.values)


Свойства isEmpty и count применимы к словарям в Swift аналогично таким же свойствам в массивах.

Можно сделать итерацию по парам ключ-значение в словаре с помощью for-in цикла.


for (monthCode, monthName) in dicMonth {
      println("Key: \(monthCode) Item: \(monthName)")
}