Pull to refresh

Кортежи в Swift

Reading time 7 min
Views 31K
Original author: Coding Explorer
В поиске информации о работе с Кортежами (Tuples) в Swift работая над своим приложением, я решил, что будет лучше объединить в одну статью всю информацию, которую я изучил или нашел, чтобы ее можно было легко использовать.

Кортежи в основном являются значением, которое может содержать несколько других значений. Составной тип может содержать также “именованные типы”, которые включают в себя классы, структуры и перечисления (также протоколы, но так как они не хранят значения непосредственно, я знал, что должен упомянуть их отдельно), а также другие составные типы. Это означает, что кортеж может содержать другие кортежи. Другой составной тип, который может содержать кортеж, является “функциональным типом”, который различным способом ссылаться на тип. Он описывает замыкания в частности стиля типа “() >() ”, чьи функции и методы соответствуют ему. Также функциональный тип может содержать другие составные типы, как кортеж, и замыкания, про которые Вы читали в моем предыдущем посте "Замыкание и Определение в Swift".


Будучи некомпетентным в технических вопросах, Вы можете думать о кортежах как о классе или структуре, которые Вы можете быстро написать, не имея необходимость определять абсолютный класс или структуру (вложенную или наоборот). Хотя согласно iBook от Apple, они, вероятно, должны использоваться только для временных значений, как возвращаемое значение из функции. Apple не объясняет почему, но я должен был догадаться, что, они, вероятно, были, оптимизированы для быстрого создания, за счет того, как они храняться. Тем не менее, одна из потрясающих новых возможностей Swift – это возвращение нескольких типов, и кортежи помогают Swift достигать этой цели, так как они технически возвращают единственное значение (сам кортеж).

Иногда пользователям интересно как же все-таки произносится кортеж на английском языке. Согласно онлайн словарю Dictionary.com, есть два допустимых произношения. В фонетической транскрипции словаря можно увидеть и вариант /ˈtjʊpəl/ и /tʌpəl/.Для тех, кому любопытно, ʊ — это звук который на письме отвечает “oo” как в слове «took»; ə — это звук который соответствует «а» на письме как в слове «about»; и ʌ звук буквы “u” как в “gut.” Это означает, что эти звуки произносятся (примерно) как too-puhl и tuh-puhl, соответственно. Я хотел узнать, откуда берет начало их происхождение, но наткнулся только на то, что они в основном являются составной частью других слов как “quadruple,” “quintuple,” и “octuple” (заметьте “tuple”” в конце каждого слова). Я лично предпочитаю too-puhl.

Но, я предполагаю, что произношения изменятся, так как каждая англоязычная страна будет ссылаться на свои стандарты произношения. Те, кто слушают Accidental Tech Podcast, очевидно согласятся с обоими вариантами Dictionary.com huhv-er (/ˈhʌv ər) и hov-er (ˈhɒv-/ ər). Те, которые не слушают его, Вы действительно должны это сделать.
Во всяком случае, хотя, Вы не зашли сюда, чтобы изучать фонетику английского языка, пришло время узнать, как использовать кортежи в Swift!

Создание кортежа

Есть несколько способов создания кортежей. Технически, я считаю, что один способ называется «Tuple Pattern». Это в значительной степени выглядит в точности как литеральный массив, кроме как того, что находиться в круглых скобках (вместо квадратных скобок), и он может иметь любой тип (в отличие от того же типа в Массиве):

let firstHighScore = ("Mary", 9001)


Вышеупомянутый способ является самым легким. Существует еще один способ создания кортежа, который пользуется преимуществом именованных параметров Swift. Позже Вы увидите, как этот способ может быть полезен:

let secondHighScore = (name: "James", score: 4096)


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

Получение данных из кортежей

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

Во-первых, Вы можете связать содержимое кортежа, используя механизм сопоставления с образцом:

let (firstName, firstScore) = firstHighScore


В этом случае, так как мы используем сопоставление с образцом, Вы также можете использовать подчеркивания, чтобы проигнорировать некоторые значение, если Вы хотите использовать только некоторые из них. Если Вы хотели получить только некоторые значение из Вашего кортежа, можно сделать следующее:

let (_, onlyFirstScore) = firstHighScore


Им также присваиваются имена по умолчанию, которые стартуют как и индексы в массивах от 0, таким образом, Вы также можете написать:

let theName = firstHighScore.0
let theScore = firstHighScore.1


Наконец, если Вы определили название кортеджа при его создании, Вы можете получить доступ к ним c помощью способа, который использует точечный синтаксис:

let secondName = secondHighScore.name
let secondScore = secondHighScore.score


Возврат кортежа из функции

Об этом шла речь в моем предыдущем посте «Функции Swift: Параметры и тип возвращаемого значения», но поскольку этот пост содержит все что, нужно знать о кортежах Swift, то я решил объединить всю информацию в одном месте.

Вот функция, которая возвращает Ваш высокий балл:

func getAHighScore() -> (name: String, score: Int)
{
	let theName = "Patricia"
	let theScore = 3894
	return (theName, theScore)
}


Таким образом, мы назвали то, чем они будут в значении возврата функции, и когда мы фактически создали кортеж, мы не должны даже давать ему имя. Так как кортеж, который я вернул и требуемый кортеж, который был возвращен в прототип функции были типами (String, Int), потому у компилятора не возникало проблемы с ним. Если не хотите определять их в прототипе функции, это нормально, но Вы просто должны указать тип, так и с указанием возвращаемого типа, поскольку ”(String, Int),” также приемлемо для компилятора.

Если Вы хотите дополнительно вернуть кортеж, Вам просто нужно добавить вопросительный знак после типа возвращаемого значения вот так:

func maybeGetHighScore() -> (String, Int)?
{
    return nil
}


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

if let possibleScore = maybeGetHighScore()
{
    possibleScore.0
    possibleScore.1
}
else
{
    println("Nothing Here")
}


Если Вы хотите узнать немного больше о Optionals в Swift, прочитайте мой предыдущий пост "Swift Optionals – Объявление, Unwrapping и Binding".

Нужно отметить еще одну интересную деталь о Кортежах и функциях, когда у Вас есть функция, которая не определяет возвращаемого значения, она фактически, возвращает пустой кортеж, который обозначен просто как” () “, просто открытая и затем закрыта круглая скобка (не используйте кавычки, они нужны только для компоновки символов, чтобы сделать их более очевидными).

Контроль доступом и Кортежи

Поскольку мои посты были в основном предназначены для иллюстрации языка программирования Swift, а не полноценные уроки (но это скоро изменится), мы не говорили слишком много о контроле доступа с моего первого поста «Контроль доступа в Swift». Как только мы полностью погрузимся в работу над уроками, они будут появляться намного чаще.

Тем не менее, они действительно влияют на кортежи в Swift. Уровень доступа кортежа определяется его составляющими и не установлен непосредственно, так как Вы бы установили для свойства или функции. Уровень доступа кортежа будет определяться уровнем доступа своего самого ограниченного компонента. Таким образом, если один тип является приватным, а другой общедоступным, то контроль доступа кортежа будет приватным.

Кортеж — тип значения

Обновление 7 октября 2014: Благодаря разработчику Clang, который направил меня на пост с Блога Apple прос Swift: Тип значения и ссылки – Блог Swift – Разработчик Apple, который действительно относит Кортеж к типу значения, рядом со структурами и перечислениями.

Прежде чем упомянуть о вышесказанном, я сделал тест используя playground, чтобы узнать, является ли кортеж типом значения или нет:

var someScore = ("John", 55)
 
var anotherScore = someScore
anotherScore.0 = "Robert"
 
println(anotherScore.0)  //Outputs:  "Robert"
println(someScore.0)     //Outputs:  "John"


Тест действительно окончательно показал, что кортежи являются типами значений. Я присвоил someScore другой переменной, названной “anotherScore”. Тогда я изменил значение для переменной anotherScore на “ Robert ”. Когда я проверял, какое имя было у anotherScore, я конечно увидел “Robert ”, но когда я проверял someScore (исходная переменная) то у него все еще было имя “John”.

Заключение

Весь код c этого поста был протестирован использовая playground в xCode 6.0.1.
Теперь у вас есть хорошая информация обо всем, что касается кортежей. Изначально эти части были распространены по всему Ibook от Apple, таким образом, Вы должны будете перейти к разделу о кортежах в первой части, о функции в следующей части, и о контроле доступа в заключительной части. Это действительно было целесообразно, что бы информация находиться в отдельных разделах, но так как мы уже говорили о тех компонентах в этом блоге ранее, то я только собрали их всех в одном посте.

Я также хотел благодарить Гэвина Уиггинса (@wigging в Twitter) за представленные обновления. Я явно не описал кортеж как составной тип, о котором сказано в Language Reference ближе к концу iBook от Apple, и он по праву заявил, что это следует уточнить.

Я вначале немного отвлекся на произношения, но мне оно показалось интересным, и я счел поделиться этим с Вами. Хотя произносите его, так как Вам нравиться, но не осуждайте кого-то за иное произношение, потому что оба вполне приемлемы. Хотя, для меня, этот пост был все же о звуке too-puhls.

Чтобы немного продолжить о том, что я упоминал в разделе «Контроль Доступа» этого поста, я планирую сделать еще больше познавательных постов в конечном итоге. Я хотел сначала охватить более общие понятия в качестве отправного пункта, но тогда, в конечном счете я дошел бы до создания уроков.

Если Вы посмотрите на некоторые из моих постов о Objective-C, то увидите что я сделал мини-уроки о том, как делать определенные вещи, такие как замена клавиатуры с помощью UIDatePicker и добавление совместного использования для вашего приложения с помощью UIActivityViewController, и скоро Вы увидите подобные посты о языке Swift. Это может быть о конкретных классах, как UIActivityViewController, или это может быть более общий пост, что вмещает несколько различных частей вместе, как замена клавиатуры. Создание некоторых мини-приложения продемонстрирует другие аспекты программирования для iOS в Swift, который также скоро появится. Я не скажу, как скоро Вы начнете видеть подобные посты (или видео, возможно). Они могут выйти на следующей неделе, или через несколько месяцев, но они будут.

Я надеюсь, что Вы сочли эту статью полезной. Если это так, пожалуйста, не стесняйтесь, поделитесь этим постом в Twitter или в других социальных сетях. Блог все еще довольно новый, и каждый репост помогает. Конечно, если у Вас есть какие-либо вопросы, пожалуйста, свяжитесь со мной на Twitter @CodingExplorer, и я посмотрю, что я могу сделать. Спасибо!
Tags:
Hubs:
+4
Comments 0
Comments Leave a comment

Articles