|
||||||||||||||||||||||||||||||||||||||
|
SwiftBook - справочник языка программирования Swift. Swift язык программирования рефератФункциональное программирование в Swift | SwiftBookФункциональное программирование это парадигма программирования, подчеркивающая вычисления с помощью функций математического плана, в основе которой лежит неизменяемость (постоянство) и выразительность, а также сводится к минимуму использование переменных и состояния. Поскольку существует минимальное пересечение и каждая функция как остров в океане вашего приложения, все становится проще тестировать. Функциональное программирование популярно также потому, что оно использует параллелизм, а с параллельными процессами легче работать. В современной действительности существования многоядерных устройств - это еще один инструмент повышения производительности. Функциональное программирование может показаться в теории сложным, именно поэтому в этом туториале мы будем разбирать его на наглядных примерах. Сначала вы будете проходить задачи известными и знакомыми вам способами, а затем попробовать свои силы в решении этих же задач с использованием функциональных методов. Пришло время повеселиться… в функциональном программировании! Простая фильтрация массиваВы начнете с очень простого: с математики. Ваша первая задача состоит в том, чтобы создать простой Swift скрипт, находящий все четные числа от 1 до 10 (включительно). Довольно простая задача и отличное введение в функциональное программирование! Фильтрация старым способомСоздайте новый файл в плейграунде Swift и сохранить его. Замените содержимое созданного файла следующим: var evens = [Int]() for i in 1...10 { if i % 2 == 0 { evens.append(i) } } print(evens)Это приведет к желаемому результату: [2, 4, 6, 8, 10](Если вы не видите консоль, то вам нужно, чтобы показался Assistant Editor, вы можете его вызвать через View/Assistant Editor/Show Assistant Editor.) Этот маленький скрипт очень прост, ключевые моменты алгоритма заключаются в следующем:
Приведенный выше код является императивным по своей сути. Инструкции указывают компьютеру, как располагать четные числа через четкие инструкции, использующие основные структуры контроля, в данном случае if и for-in. Код работает просто отлично, но есть важное "но" - тестирование на то, является ли число четным, закопано внутри цикла. Существует также глубокая связь: желаемое действие добавления числа в массив находится внутри условия. Если вы хотите напечатать каждое четное число где-то еще в вашем приложении, то кроме копи-пейста лучшего варианта у вас и не будет. Функциональная фильтрацияДобавьте следующее в конец вашего плейграунда: func isEven(number: Int) -> Bool { return number % 2 == 0 } evens = Array(1...10).filter(isEven) print(evens)Вы увидите, что функциональный код приводит к точно такому же результату, как и императивная версия: [2, 4, 6, 8, 10]Давайте рассмотрим подробнее функциональную версию. Она состоит из двух частей:
Вы передаете функцию isEven в качестве параметра для фильтрации, но запомните, что функции теперь стали называться замыканиями. Попробуйте добавить следующую, более краткую версию в плейграунд: evens = Array(1...10).filter { (number) in number % 2 == 0 } print(evens)Убедитесь, что результаты всех трех вариантов одинаковые. Приведенный выше пример показывает, что компилятор выводит тип параметра числа и возвращает типы замыкания из контекста использования. Если вы хотите, чтобы ваш код был еще более кратким, то попробуйте следующее: evens = Array(1...10).filter { $0 % 2 == 0 } print(evens)Код выше использует сокращенное обозначение аргумента, неявные возвращения …, вывод типа ... И это работает! ЗаметкаИспользование сокращенного обозначения аргумента является вопросом предпочтений. Лично я считаю, что для простых примеров, таких как приведен выше, сокращенное обозначение - это то, что нужно. Тем не менее, я бы выбрал явные имена аргументов для чего-то более сложного. Компиляторы не связаны с именами переменных, но с их помощью мир станет гораздо разнообразнее! Функциональная версия этого кода, безусловно, более краткая, чем его императивный эквивалент. Этот простой пример демонстрирует несколько интересных особенностей, общих для всех функциональных языков:
Вы могли заметить, что в Objective-C тоже есть демонстрация некоторых из этих функций за счет использования блоков. Swift, однако, идет дальше, чем Objective-C в развитии функционального программирования, соединяя более лаконичный синтаксис и встроенные функциональные возможности, такие как filter. Магия фильтровМассивы в Swift имеют ряд функциональных методов, таких как map, join и reduce. Что, собственно, происходит за кулисами этих методов? Пришло время прикоснуться к магии фильтров и добавить собственную реализацию. В этом же плейграунде, добавьте следующую функцию: func myFilter<T>(source: [T], predicate:(T) -> Bool) -> [T] { var result = [T]() for i in source { if predicate(i) { result.append(i) } } return result }Выше вы видите общую (generic) функцию, которая принимает в качестве своих входных параметров исходный массив типа T, и предекат, или функцию, которая принимает экземпляр типа T и возвращает Bool. Реализация MyFilter выглядит практически также, как императивная версия, которую вы добавили в начале. Основное отличие заключается в том, что у вас есть условие, которое проверяется как функция, а не просто жестко hard-code (определять в коде конкретные значения переменных вместо того, чтобы получать их из внешних источников). Поработаем с добавленной реализацией фильтра, добавив следующий код: evens = myFilter(Array(1...10)) { $0 % 2 == 0 } print(evens)Опять результат такой же! Задачка!Вышеуказанная функция фильтра является глобальной, а вы сможете сделать ее методом массива? Подсказка №1Вы можете добавить myFilter в массив с помощью расширения класса. Подсказка №2Вы можете расширить Array, но не Array<T>. Это означает, что, когда вы перебираете элементы массива через себя, вы должны выполнить приведение. Функция ReduceПредыдущий пример был простым и использовал лишь один функциональный метод. В этом разделе, вы попробуете реализовать более сложную логику с использованием функциональных методов. Создайте новый плейграунд и ждите новое задание! Своя функция ReduceВаша задача в этом разделе лишь немного сложнее. Возьмите четные числа от 1 до 10, и вычислите их сумму. Для этого вам понадобится функция reduce, которая принимает несколько входных значений и генерирует одно на выходе. Я уверен, что вы с успехом справитесь и сами, но в любом случае ответ ниже! Добавьте следующую строку в ваш плейграунд: var evens = [Int]() for i in 1...10 { if i % 2 == 0 { evens.append(i) } } var evenSum = 0 for i in evens { evenSum += i } print(evenSum)В Assistant Editor будет следующий результат: 30Императивный код, указанный выше, написан в том же ключе, что и код в предыдущем примере, с добавлением дополнительного цикла for-in. Давайте посмотрим, как выглядит функциональный эквивалент! Функциональная ReduceДобавьте следующую строку в ваш плейграунд: evenSum = Array(1...10) .filter { (number) in number % 2 == 0 } .reduce(0) { (total, number) in total + number } print(evenSum)Вы увидите точно такой же результат: 30Предыдущий раздел охватывал создание массива и использование filter. Конечным результатом этих двух операций является массив с пятью числами [2, 4, 6, 8, 10]. Новым шагом в коде выше стало использование reduce. reduce является чрезвычайно универсальным методом массивов и выполняет функцию однократно для каждого элемента, накапливая результаты. Для того чтобы понять, как работает метод reduce, нужно посмотреть на его описание: func reduce<U>(initial: U, combine: (U, T) -> U) -> UПервый параметр - это начальное значение типа U. В вашем текущем коде, начальное значение равно 0, и имеет тип Int (следовательно, U это в данном случае Int). Второй аргумент - это функция combine, и она выполняется один раз для каждого элемента массива. combine принимает два аргумента: первый, типа U, является результатом предыдущего вызова combine, второй - значением элемента массива, с которым он объединен. Результат, возвращаемый reduce, это значение, возвращаемое последним вызовом combine. Давайте разберем все шаг за шагом. В вашем коде, первая итерация reduce приводит к следующему: Сначала total имеет значение 0, а первый элемент входного массива равен 2. Если мы просуммируем эти значения, то на выходе (result) получится 2. Вторая итерация показана ниже: Во второй итерации, входное значение равно значению предыдущей итерации и следующего элемента из входного массива. Объединение их приводит к 2 + 4 = 6. Продолжаем проделывать тоже самое для всех элементов массива, что приводит к следующим вводам и выводам: Обозначенное звездочкой число в правом нижнем углу - общий результат. Это довольно простой пример, на практике же вы можете выполнять любые виды интересных и сильных преобразований с reduce. Ниже приведены несколько простых примеров. Добавьте следующую строку в ваш плейграунд: let maxNumber = Array(1...10) .reduce(0) { (total, number) in max(total, number) } print(maxNumber)Этот код использует reduce, чтобы найти максимальное значение в массиве целых чисел. В этом случае результат весьма очевиден! Помните, что здесь total на самом деле просто максимальный результат max последней итерации reduce. Если вы пытаетесь изо всех сил понять, как это работает, почему бы не создать еще одну таблицу, где вы вычислите вводы и выводы combine (т.е. замыкания) для каждой итерации? Примеры, которые вы видели, все уменьшают массивы целых чисел до одиночных целочисленных значений. Конечно, у reduce есть два типа параметров, U и T и они могут быть разными, и, конечно, не должны быть интеджерами. Это означает, что вы можете уменьшить массив одного типа до совершенно другого типа. Добавьте следующую строку в ваш плейграунд: let numbers = Array(1...10) .reduce("numbers: ") {(total, number) in total + "\(number) "} print(numbers)Это приводит к следующему выводу: numbers: 1 2 3 4 5 6 7 8 9 10Этот пример понижает массив целых чисел до строки, указанной выше. Немного практики и вы будете использовать reduce по-всякому! ЗадачаМожете ли вы использовать reduce для того, чтобы преобразовать массив digits в целое число, если массив ввода такой: let digits = ["3", "1", "4", "1"]Ваш понижающий метод должен возвращать Int со значением 3141. Магия ReduceВ предыдущем разделе, вы разработали свою собственную реализацию filter, что оказалось удивительно просто. Теперь вы увидите, что то же самое можно сделать и для reduce. Добавьте следующий код в ваш плейграунд: extension Array { func myReduce<T, U>(seed:U, combiner:(U, T) -> U) -> U { var current = seed for item in self { current = combiner(current, item as! T) } return current } }Код выше добавляет метод myReduce в Array, который имитирует встроенную функцию Array. Этот метод просто перебирает каждый элемента массива, вызывая на каждом этапе combiner. Чтобы это проверить, замените один из методов reduce в вашем плейграунде на myReduce. Вы, наверное, на этом этапе думаете о том, почему вам должно хотеться реализовать filter или reduce? Ответ: “А и не должно хотеться!” Но тем не менее, вы можете захотеть расширить использование функциональной парадигмы в Swift и реализовать собственные функциональные методы. Видеть и понимать, насколько это легко реализовывать такие действенные методы, как reduce, очень важно и нужно. Построение индексаПришло время решить более сложную задачу, для этого нам нужно создать новый плейграунд. В этом разделе вы будете использовать функциональные методы программирования для группировки списка слов в индекс по первой букве слова. В новом плейграунде добавьте: import Foundation let words = ["Cat", "Chicken", "fish", "Dog", "Mouse", "Guinea Pig", "monkey"]Для выполнения задачи этого раздела, вам нужно сгруппировать эти слова по их первым буквам (без учета регистра!). Добавьте следующее: typealias Entry = (Character, [String]) func buildIndex(words: [String]) -> [Entry] { return [Entry]() } print(buildIndex(words))typealias Entry определяет тип кортежа для каждой записи индекса. Использование typealias в этом примере делает код более удобным для чтения, устраняя необходимость повторно указать тип кортежа в полном объеме. Вам нужно добавить код, создающий индекс, в buildIndex. Строим индекс императивноНачнем с императивного подхода; обновите buildIndex следующим: func buildIndex(words: [String]) -> [Entry] { var result = [Entry]() var letters = [Character]() for word in words { let firstLetter = Character(word.substringToIndex(word.startIndex.advancedBy(1)).uppercaseString) if !letters.contains(firstLetter) { letters.append(firstLetter) } } for letter in letters { var wordsForLetter = [String]() for word in words { let firstLetter = Character(word.substringToIndex(word.startIndex.advancedBy(1)).uppercaseString) if firstLetter == letter { wordsForLetter.append(word) } } result.append((letter, wordsForLetter)) } return result }У этой функции две части, у каждой части свой собственный цикл for. Первая половина перебирает слова, чтобы построить массив букв; вторая перебирает эти буквы, находя слова, которые начинаются с нужной буквы, чтобы построить обратный массив. После реализации, вы увидите желаемый результат: [("C", ["Cat", "Chicken"]), ("F", ["fish"]), ("D", ["Dog"]), ("M", ["Mouse", "monkey"]), ("G", ["Guinea Pig"])](Текст выше немного отформатирован для ясности.) У этой императивной реализации довольно много шагов и вложенных циклов, от этого возникают сложности понимания. Давайте посмотрим, как выглядит функциональный эквивалент. Создание индекса функциональным путемСоздайте новый файл в плейграунде и добавьте ту же первоначальную структуру: import Foundation let words = ["Cat", "Chicken", "fish", "Dog", "Mouse", "Guinea Pig", "monkey"] typealias Entry = (Character, [String]) func buildIndex(words: [String]) -> [Entry] { return [Entry]() } print(buildIndex(words))На данном этапе, заявление print будет выводить пустой массив: []Первым шагом на пути создания индекса будет преобразование слов в массив, содержащий только первые буквы. Обновите buildIndex следующим: func buildIndex(words: [String]) -> [Entry] { let letters = words.map { (word) -> Character in Character(word.substringToIndex(word.startIndex.advancedBy(1)).uppercaseString) } print(letters) return [Entry]() }Плейграунд в настоящее время выводит массив букв верхнего регистра, каждой букве соответствует слово в вводном массиве. [C, C, F, D, M, G, M]В предыдущих разделах, вы столкнулись с filter и reduce. Приведенный выше код представляет map, другой функциональный метод, являющийся частью API массива. map создает новый массив с результатами вызовов прилагаемого замыкания для каждого элемента в каждом массиве. Вы можете использовать map для выполнения преобразований. В этом случае map преобразует массив типа [String] в массив типа [Character]. Сейчас массив букв содержит дубликаты, а у нужного вам индекса должно быть только одно вхождение каждой буквы. К сожалению, у типа массива в Swift нет метода дедупликации. Это то, что вам нужно написать самим! В предыдущих разделах мы видели, что повторно реализовать reduce и filter легко. Добавление метода дедупликации также не должно вызвать сложности. Добавьте следующую функцию в вашем плейграунде перед buildIndex: func distinct<T: Equatable>(source: [T]) -> [T] { var unique = [T]() for item in source { if !unique.contains(item) { unique.append(item) } } return unique }При построении нового массива, содержащего только уникальные элементы, distinct перебирает все элементы массива. Обновите buildIndex, чтобы привести в работу distinct: func buildIndex(words: [String]) -> [Entry] { let letters = words.map { (word) -> Character in Character(word.substringToIndex(word.startIndex.advancedBy(1)).uppercaseString) } let distinctLetters = distinct(letters) print(distinctLetters) return [Entry]() }Ваша плейграунд теперь будет выводить уникальные буквы: [C, F, D, M, G]Теперь, когда у вас есть массив различных букв, следующей задачей в создании индекса, будет преобразование каждой буквы в экземпляр Entry. Не звучит как преобразование? Еще одна работа для map! Обновите buildIndex следующим образом: func buildIndex(words: [String]) -> [Entry] { let letters = words.map { (word) -> Character in Character(word.substringToIndex(word.startIndex.advancedBy(1)).uppercaseString) } let distinctLetters = distinct(letters) return distinctLetters.map { (letter) -> Entry in return (letter, []) } }Второй вызов map принимает массив символов и выводит массив экземпляров Entry: [(C, []), (F, []), (D, []), (M, []), (G, [])](Опять же, текст выше для ясности отформатирован.) Вы на финишной прямой. Заключительная задача состоит в том, чтобы заполнить каждый экземпляр ввода словами, которые начинаются с данной буквы. Обновите функцию для добавления вложенного filter, следующим образом: func buildIndex(words: [String]) -> [Entry] { let letters = words.map { (word) -> Character in Character(word.substringToIndex(word.startIndex.advancedBy(1)).uppercaseString) } let distinctLetters = distinct(letters) return distinctLetters.map { (letter) -> Entry in return (letter, words.filter { (word) -> Bool in Character(word.substringToIndex(word.startIndex.advancedBy(1)).uppercaseString) == letter }) } }Это даст вам желаемый результат: [(C, [Cat, Chicken]), (F, [fish]), (D, [Dog]), (M, [Mouse, monkey]), (G, [Guinea Pig])]Во второй половине функции теперь есть вложенный вызов для filter внутри map. Он отфильтрует список слов для каждой отдельной буквы, и, таким образом, опередит те слова, которые начинаются с нужной буквы. Реализация теперь уже более краткая и ясная, чем ее императивный эквивалент, но еще есть куда совершенствоваться: код извлекает и делает заглавной первую букву несколько раз. Было бы хорошо убрать это дублирование. Если бы это был код на Objective-C, у вас было бы несколько вариантов: Вы могли бы создать метод, который бы выполнял эту функцию или, возможно, вы могли бы добавить этот метод непосредственно к NSString через категорию класса. Тем не менее, если вам нужно выполнить эту задачу в рамках buildIndex, то в служебном методе не достаточно смысловой ясности и использование категории класса будет излишним. К счастью, Swift предлагает отличный вариант! Обновите buildIndex следующим: func buildIndex(words: [String]) -> [Entry] { func firstLetter(str: String) -> Character { return Character(str.substringToIndex(str.startIndex.advancedBy(1)).uppercaseString) } let letters = words.map { (word) -> Character in Character(word.substringToIndex(word.startIndex.advancedBy(1)).uppercaseString) } return distinct(words.map(firstLetter)) .map { (letter) -> Entry in return (letter, words.filter { (word) -> Bool in Character(word.substringToIndex(word.startIndex.advancedBy(1)).uppercaseString) == letter }) } }Вы увидите точно такой же результат, как видели и раньше. Приведенный выше код добавляет функцию firstLetter, вложенную в buildIndex, и в результате, является полностью локальной по отношению к внешней функции. Такой вариант получает преимущество функций первого класса в Swift, которые вы можете использовать, как переменные, что позволяет их присваивать и определять их область использования. Новый код удаляет дублирование, но вы можете сделать еще больше, чтобы очистить buildIndex. Первый шаг map, направленный на построение массива букв, принимает замыкание, тип которого (String) -> Character. Вы можете заметить, что этот тип точно такой же, как у функции firstLetter, которую вы только что добавили, что означает, что вы можете передать ее непосредственно на map. Используя эти знания, вы можете переписать функцию следующим образом: func buildIndex(words: [String]) -> [Entry] { func firstLetter(str: String) -> Character { return Character(str.substringToIndex(str.startIndex.advancedBy(1)).uppercaseString) } return distinct(words.map(firstLetter)) .map { (letter) -> Entry in return (letter, words.filter { (word) -> Bool in Character(word.substringToIndex(word.startIndex.advancedBy(1)).uppercaseString) == letter }) } }Конечный результат краткий, но весьма выразительный. Возможно, вы заметили интересный побочный эффект функциональных методов, которые вы до сих пор использовали. В то время как ваши императивные решения полагались на переменные (с использованием ключевого слова var), то все функциональные эквиваленты вы определяли как константы (через let). Вы должны стремиться к неизменности. Неизменные типы легче тестировать и использовать параллелизм. Функциональное программирование и неизменные типы, как правило, идут рука об руку. В результате, ваш код будет более кратким, а также менее подвержен ошибкам. Он будет круто выглядеть и произведет впечатление на ваших друзей! ЗаметкаСейчас buildIndex возвращает неотсортированный индекс; порядок экземпляров Entry зависит от порядка слов в вводном массиве. Ваша задача состоит в том, чтобы отсортировать индекс в алфавитном порядке. Для примера массив строк, то это дало бы следующий вывод: [(C, [Cat, Chicken]), (D, [Dog]), (F, [fish]), (G, [Guinea Pig]), (M, [Mouse, monkey])]Подсказка:Тип массива в Swift имеет метод sort, но этот метод изменяет массив, а не возвращает новый, отсортированный экземпляр. Для работы он требует изменяемый массив. В общем, безопаснее иметь дело с неизменяемыми данными, поэтому я бы не советовал этот метод! В качестве альтернативы, использовать метод сортировки, который возвращает второй отсортированный массив. Что дальше?Дальше, вы можете продолжить изучать наши туториалы по мере их появления, а также, параллельно читать перевод официальной книги по языку программирования Swift. И, для более подробного изучения языка, вы можете пройти наши курсы! Урок подготовил: Акулов Иван Источник урока: Источник swiftbook.ru Как Swift навсегда изменит мир программированияКрис Латтнер полтора года создавал новый язык программирования, и за все это время никому об этом не сказал, даже своим близким друзьям и коллегам. Он начал летом 2010 года, работая по ночам и выходным, и к концу года уже наметил основы нового языка. Именно тогда он рассказал о своем проекте топ-менеджерам компании, которые были настолько впечатлены, что подключили к работе еще нескольких опытных инженеров. Спустя еще полтора года его проект стал основным направлением компании, в котором было задействовано огромное количество специалистов, работающих бок о бок с Латтнером. Это означало лишь одно, что новый язык программирования вскоре должен изменить компьютерный мир. Латтнер, как вы понимаете, работал на Apple. Новый язык был назван Swift, и Apple представила его на всеобщее обозрение во время WWDC 2 июня. Спустя 4 года после того, как Латтнер приступил к своему детищу, новый язык шокировал всех, за исключением нескольких осведомленных лиц Apple. Викрам Адве, преподаватель Иллинойского университета, когда-то помогал Латтнеру создавать основы для одной программы, которая затем легла в основу Swift. Но, как и все остальные, он был невероятно удивлен тем, что его студент столько лет создавал новый язык программирования. «Apple настолько скрытная компания, и, похоже, Крис выпил ее волшебного зелья», — сказал, смеясь, Адве. — «Я знал, что он работает над проектом, который занимает все его время, но это все, что я знал». Как правило, когда из ниоткуда появляется новый язык, ему требуется несколько лет, чтобы завоевать свою аудиторию. Это утверждение справедливо, даже если речь идет о таком гиганте, как Apple. В 2009 году Google представила язык Go, разработанный известнейшими инженерами Кеном Томпсоном и Робом Пайком, и он до сих пор не завоевал большую популярность в мире. Но Swift — это иной случай. Он может достичь массового использования в кратчайшие сроки, превосходя по скорости освоения Java и C# в конце 90-х и начале 2000-х годов. Преимущество Swift заключается в том, что он написан для среднего программиста и подойдет для создания самого простого мобильного приложения. А с таким простым инструментом, как Playgrounds, любой разработчик сможет легко изучить этот язык самостоятельно. К тому же, уже сейчас у множества программистов есть ряд причин для использования Swift. Сегодня сотни тысяч разработчиков пишут приложения для iPhone и iPad, используя Objective-C. И ввиду огромной популярности данной платформы, они, безусловно, продолжат их писать и дальше. Swift содержит в себе значительные улучшения, по сравнению с Objective-C, а это значит, что огромное сообщество разработчиков по всему миру начнет изучать новый язык в ближайшие месяцы. «Не было никакого реального стимула использовать Google Go», — говорит Пол Йансен, который отслеживал использование различных языков программирования при помощи Tiobe Index в течение последних 15 лет. «Разница заключается в том, что у Swift он есть». Уже сейчас около 2400 проектов, находящихся на GitHub, популярном хостинге для открытых IT-проектов, используют Swift. А в этом месяце новый язык дебютировал под 16 номером в списке самых обсуждаемых языков по версии Tiobe. Да, почти то же самое происходило с Go в 2009 году, но с тех пор данный язык потерял свое влияние. А Swift со временем должен только усилить свои позиции. «Люди перейдут на новый язык, потому что на нем проще писать код», — говорит Йансен. — «Они должны выбрать либо Objective-C, либо Swift. И большинство выберет Swift». Крис Латтер курирует инструменты разработчиков Apple, все инструменты, которые используют инженеры Apple и сторонние разработчики, занимающиеся программным обеспечением для персональных компьютеров, ноутбуков, планшетов и смартфонов. Будучи аспирантом Иллинойского университета, под руководством Викрама Адве, он создал систему для разработчиков под названием LLVM, которая сейчас составляет основу Xcode. После того, как Латтнер присоединился к Apple в 2005 году, компания перешла на LLVM, что повлияло на то, как Objective-C стал использоваться разработчиками для создания приложений. И спустя 5 лет Латтнер внедрил данную систему в качестве основы Swift. Он отказался давать интервью для данной статьи без одобрения PR-отдела Apple, но он кратко описал эволюцию Swift на своей странице. Даже не вдаваясь в детали, можно сказать, что Латтнер построил Swift в тандеме с существующими инструментами Apple, чтобы разработчики могли легко использовать новый язык наряду с Objective-C. Другими словами, Swift — это не только язык. Он тесно взаимодейстует с другими инструментами, которые позволяют разработчикам создавать свое программное обеспечение. А они включают в себя не только встроенную среду разработки, но и, в том числе, отладчик, который выявляет все погрешности кода. И большинство из этих инструментов знакомы каждому разработчику Apple. В общем, инженеры Apple создали простой переход для десятков тысяч разработчиков, которые пишут программы под iPhone, iPad и Mac. Так как разработчики никогда раньше не работали с этим языком, у них должны быть веские причины, чтобы перейти от Objective-C к Swift. «Я первый и единственный на сегодняшний момент человек с опытом работы Swift в течение 4 лет», — написал Латтнер в Twitter. Для того, чтобы освоить новый язык, нужно время и усердие, что, зачастую, для многих является большой проблемой. Но Латтнер и Apple привели неоспоримые аргументы в пользу Swift. Нельзя сказать, что он намного привлекательнее других языков, таких как C#, Ruby или Python. Но это большой шаг вперед по сравнению с Objective-C, который корнями уходит в середину 80-х годов, и который не так легок в использовании. «Множество людей отказывается от Objective-C из-за его необычного синтаксиса», — говорит Майк Эш, инженер Apple, который последние 15 лет занимается разработкой разнообразного программного обеспечения компании, — «У Swift более правильный, стандартный синтаксис, который сможет заинтересовать таких людей». «Он сделан для продуктивного программиста, и позволяет ему делать больше вещей за меньшее время». Как пишет Латтнер на своей странице, Playgrounds позволяет сделать программирование более интерактивным и доступным. «На него сильно повлияла философия дизайнера Брета Виктора и его интерактивная программная система Light Table. Как и в Light Table, он позволяет вам писать код на одной стороне экрана и смотреть на появляющиеся результаты с другой. Другими словами, вы можете прогонять программу во время того, как ее пишите». Во время WWDC 2014 Латтнер продемонстрировал некоторые возможности Swift и Playgrounds на примере очень простой игры. Инструменты позволяют добавлять новый код без повторной компиляции и перезапуска всей системы. «Когда вы вносите изменения, они внедряются в уже запущенный процесс, в ту версию программы, которая работает в этот момент», — говорит Крис Грейнджер, один из создателей Light Table. «Я надеюсь, что программирование станет более доступным и веселым занятием», — написал Латтнер. — «Мы обращаемся к новому поколению программистов и помогаем пересмотреть методику преподавания информатики». Light Table может совершать то же самое, только с различными языками, такими как Python, Clojure и Javascript. Но, по мнению Грейнджера, Playgrounds может быть особенно полезным инструментом, потому что Swift был разработан специально для работы с ним. «Поскольку они создали этот язык и его контролируют, они могут делать те вещи, которые мы не можем производить с другими языками». Playgrounds еще немного подглючивает, но уже сейчас он может сильно сократить время, необходимое для написания кода. «Мгновенная обратная связь Playgrounds может привлечь огромное количество людей в новую область». Традиционно существовала пропасть между компилированными языками программирования, такими как Objective-C и C++, и интерпретируемыми языками, такими как Python, Ruby и PHP. Используя первые, вы сначала должны были написать код, а затем ждать, пока ваш компилятор превратит его в некое программное обеспечение. Но после того, как программа будет собрана, она будет работать очень быстро. Интерпретируемые языки позволяют тестировать программу почти мгновенно, но работают медленно. Swift собрал лучшее из этих двух миров. Он дружественен как по отношению к разработчику, так и по отношению к компьютеру. Apple — не единственная компания, которая изучает новые области программирования. Facebook пытается создать нечто подобное, разрабатывая языки Hack и D. Google прощупывает данную почву при помощи Go, Mozilla делает то же самое с Rust. Но все эти языки далеки от Swift. Да, они находятся в свободном доступе, и в теории, они могут быстрее распространиться при помощи различных устройств и сервисов других компаний. Со Swift — совершенно другая ситуация, его программное и аппаратное обеспечение жестко контролируется. И, скорее всего, его нельзя будет использовать для других платформ. Но даже если он останется исключительно за Apple, он сможет получить огромное влияние и распространение, не сравнимое ни с одним современным языком программирования. И все благодаря столь популярным iPhone, iPad и Mac. Да, многие другие языки могут проделывать те же вещи, что и Swift, а некоторые даже лучше, а в том же Light Table есть альтернатива Playgrounds. Но все же, Swift уникален своей простотой и интерактивностью и уже сейчас, спустя всего несколько месяцев после своего представления, он интересен многим десяткам тысяч разработчиков по всему миру. via Wired lifehacker.ru Swift (язык программирования) — википедия оргСтарший вице-президент по разработке программного обеспечения Apple Крейг Федериги во время анонса этого продукта заявил, что язык программирования Swift был заложен ещё в платформе NeXT (ОС NeXTSTEP выпускалась в 1989—1995 годах), которая стала основой для современной macOS, а затем и iOS[8]. Разработка текущего варианта языка Swift началась в 2010 году Крисом Латтнеромruen, руководителем отдела разработки инструментов для создания программного обеспечения Apple и одним из основных разработчиков LLVM. Swift заимствовал идеи из «Objective-C, Rust, Haskell, Ruby, Python, C#, CLU, и еще из стольких многих языков, что сложно перечислить»[9]. 2 июня 2014 года на конференции WWDC Swift был официально представлен вместе с бесплатным руководством по использованию языка объёмом в 500 страниц, доступным на сервисе «iBook Store»[10]. Версия Swift 1.0 была выпущена 9 сентября 2014 года, вместе с «Gold Master» версией Xcode 6.0 для iOS. 8 июня 2015 года компания Apple объявила о выпуске новой версии Swift 2.0, которая получила более высокую производительность, новое API обработки ошибок, улучшения синтаксиса языка, а также функцию проверки доступности функций Swift для целевых ОС[11]. 3 декабря 2015 года была выпущена бета версия Swift 3.0 с поддержкой операционных систем OS X, iOS и Linux и лицензированная под открытой лицензий Apache 2.0 license with a Runtime Library Exception[12][13]. 10 апреля 2016 года Google объявила о намерениях сделать Swift так называемым «первым языком» для Android. Язык программирования очень быстрый, поэтому Google планирует им воспользоваться. Скорее всего, это уменьшит количество приложений, которые сначала выходят на iOS, а позже на Android[14].[неавторитетный источник?] 19 сентября 2017 года была выпущена версия Swift 4.0. Swift заимствовал довольно многое из Objective-C, однако он определяется не указателями, а типами переменных, которые обрабатывает компилятор. По аналогичному принципу работают многие скриптовые языки. В то же время, он предоставляет разработчикам многие функции, которые прежде были доступны в C++ и Java, такие как определяемые наименования, так называемые обобщения и перегрузка операторов. Часть функций языка выполняется быстрее по сравнению с другими подобными языками. Например, сортировка комплексных объектов выполняется в 3,9 раз быстрее, чем в Python, и почти в 1,5 раза быстрее, чем в Objective-C.[15][неавторитетный источник? 591 день][16] Код, написанный на Swift, может работать вместе с кодом, написанным на языках программирования C и Objective-C в рамках одного и того же проекта[2]. Репозитории SwiftApple разделила код Swift на несколько открытых репозиториев.
Swift: основной Swift репозиторий, который содержит исходный код для компилятора Swift, стандартная библиотека и SourceKit; Swift-Evolution: документы, относящиеся к продолжающемуся развитию Swift, включая цели для предстоящих выпусков, предложения для изменений и расширений Swift;
Swift corelibs-foundation: исходный код для Foundation, который предоставляет общую функциональность для всех приложений; Swift corelibs-libdispatch: исходный код для libdispatch, который предоставляет примитивы параллелизма для работы на многоядерном аппаратном обеспечении; Swift corelibs-xctest: исходный код для XCTest, который обеспечивает фундаментальную инфраструктуру тестирования для Swift-приложений и библиотек;
Swift package-manager: исходный код для менеджера пакетов Swift; Swift llbuild: исходный код для llbuild, система низкого уровня, который использует Swift package-manager;
Swift опирается на несколько других проектов с открытым кодом, особенно на компилятор LLVM. Swift llvm: исходный код LLVM, с кусочками Swift-дополнений; Swift clang: исходный код для Clang, с кусочками Swift дополнений; Swift lldb: исходный код Swift-версии LLDB, для отладки Swift программ; www-wikipediya.ru |
|
||||||||||||||||||||||||||||||||||||
|
|