Язык программирования Swift. Русская версия / Хабр
Привет, Хабр! 2 июня все мы воочию могли наблюдать, как компания Apple начала творить революцию в стане Objective-C разработчиков, представив миру свой новый язык программирования – Swift. Вместе с этим, она выложила в открытый доступ небольшую документацию по языку, которую мы решили перевести, если на то будет спрос. Предлагаем вашему вниманию перевод первой главы. Если тема будет интересна, то мы продолжим публиковать перевод каждую неделю.Оглавление
Добро пожаловать в Swift
О Swift
Введение в Swift
Language guide
The Basics
Basic Operators
String and Characters
Collection Types
Control Flow
Functions
Closures
Enumerations
Classes and Structures
Properties
Methods
Subscripts
Inheritance
Initialization
Deinitialization
Automatic Reference Counting
Optional Chaining
Type Casting
Nested Types
Extensions
Protocols
Generics
Advanced Operators
Language Reference
About the Language Reference
Lexical Structure
Types
Expressions
Statements
Declarations
Attributes
Patterns
Summary of the Grammar
Trademarks
Добро пожаловать в Swift
О языке Swift
Swift – это новый язык программирования для разработки iOS и OS X приложений, который сочетает в себе все лучшее от C и Objective-C, но лишен ограничений, накладываемых в угоду совместимости с C. В Swift используются паттерны безопасного программирования и добавлены современные функции, превращающие создание приложения в простой, более гибкий и увлекательный процесс. Swift, созданый нами с чистого листа, – это возможность заново представить себе, как разрабатываются приложения.
Swift разрабатывался нами несколько лет. Основой нового языка программирования послужили существующие компилятор, отладчик и фреймворки. Мы упростили процесс управления памятью с помощью механизма автоматического подсчета ссылок – Automatic Reference Counting (ARC). Наши фреймворки также подверглись серьезной модернизации. Objective-C начал поддерживать блоки, литералы и модули – все это создало благоприятные условия для внедрения современных технологий. Именно эта подготовительная работа послужила фундаментом для нового языка программирования, который будет применяться для разработки будущих программных продуктов для Apple.
Разработчикам Objective-C Swift покажется знакомым. Он сочетает в себе читабельность именованных параметров и мощь динамической объектной модели Objective-C. Он открывает доступ к уже существующим фреймворкам Cocoa и совместим с кодом, написанным на Objective-C. Построенный на этой общей основе язык предлагает множество новых возможностей и унифицирует процедурные и объектно-ориентированные аспекты языка программирования.
Swift не отпугнет и начинающих программистов. Это первый мощный язык программирования, такой же понятный и увлекательный, как скриптовый язык. Он поддерживает так называемые playground-ы, которые позволяют программистам экспериментировать с кодом, видя результат в режиме реального времени без необходимости компилировать и запускать приложение.
Swift вобрал в себя все лучшее от современных языков и разработан с учетом обширного опыта компании Apple. Наш компилятор – синоним производительности, наш язык оптимизирован для разработки без оглядки на компромиссы. Он спроектирован таким образом, чтобы вы смогли легко разработать и ваше первое приложение «hello, world!», и даже целую операционную систему. Все это делает Swift важным инструментом для разработчиков и для самой компании Apple.
Swift – это новый фантастический способ создавать приложения для iOS и OS X, и мы продолжим развивать его, добавляя новый функционал и представляя новые возможности. Наша цель – амбициозна. И мы с нетерпением ждем, чтобы увидеть, что вы сумеете создать при помощи него.
Введение в Swift
По давней традиции первая программа на новом языке должна выводить на экран слова
“Hello, world”
. С помощью Swift это делается так:println("Hello, world")
Если вы когда-нибудь разрабатывали на C или Objective-C этот синтаксис должен казаться вам до боли знакомым – в Swift эта строчка кода является законченной программой. Вам больше не нужно импортировать отдельные библиотеки для обеспечения базового функционала вроде ввода/вывода в консоль или работы со строками. Код, написанный в глобальной области видимости, является точкой входа в программу, таким образом функция
main
больше не нужна. Также обратите внимание на отсутствие точки с запятой в конце каждой строки.Это введение содержит достаточно информации, чтобы начать писать код на Swift. Не переживайте, если вам будет что-то непонятно – мы все детально объясним в последующих главах.
Замечание
Для лучшего понимания материала мы рекомендуем использовать режим playground в Xcode. Playground позволяет вам видеть результат сразу в процессе редактирования кода без необходимости компилировать и запускать приложение.
Простые типы данных
Используйте
let
для создания константы и var
для создания переменной. Тип константы указывать не нужно, вы можете присвоить ей значение лишь единожды.var myVariable = 42
myVariable = 50
let myConstant = 42
Типы константы и переменной должны совпадать с типами присваиваемых им соответствующих значений. Однако это не означает, что вы должны напрямую указывать их тип. Компилятор автоматически определит тип константы и переменной при присваивании им значения. Так, в приведенном примере компилятор определит, что
myVariable
имеет целочисленный тип.Если же инициализатор отсутствует или не предоставляет достаточной информации, вы можете указать тип самостоятельно после переменной, разделив название и тип двоеточием:
let implicitInteger = 70
let inplicitDouble = 70.0
let inplicitDouble: Double = 70
Давайте поэкспериментируем
Создайте константу с типом Float и проинициализируйте ее числом 4.
Значения никогда не конвертируются в другой тип неявно. Если вам необходимо конвертировать значение в другой тип, делайте это явно:
let label = "The width is "
let width = 94
let widthLabel = label + String(width)
Давайте поэкспериментируем
Попробуйте удалить явное преобразование к типу String в последней строке. Какую ошибку вы получите?
Имеется более простой способ включения значений в строки: для этого заключите выражение в скобки и поставьте перед ними обратный слэш (
\
). Пример:let apples = 3
let oranges = 5
let appleSummary = "I have \(apples) apples."
let fruitSummary = "I have \(apples + oranges) pieces of fruit."
Давайте поэкспериментируем
Попробуйте использовать конструкцию\()
и выведите на экран строку, включающую результат суммы двух целочисленных переменных и чье-нибудь имя.
При работе с массивами и ассоциативными массивами (словарями, dictionary) используются квадратные скобки (
[]
):var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[1] = "bottle of water"
var occupations = [
"Malcolm": "Captain",
"Kaylee": "Mechanic",
]
occupations["Jayne"] = "Public Relations"
Чтобы создать пустой массив или dictionary, используйте следующий синтаксис:
let emptyArray = String[]()
let emptyDictionary = Dictionary<String, Float>()
Для создания пустых массивов и словарей используйте
[]
и [:]
соответственно, – например, когда вы присваиваете новое значение переменной или передаете аргумент в функцию.shoppingList = [] // Went shopping and bought everything.
Условия и циклы
Для создания условий используются операторы
if
и switch
, для создания циклов – for-in
, for
, while
и do-while
. При этом выделять круглыми скобками условия и инициализирующие выражения необязательно, тогда как фигурные скобки обязательны.let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
if score > 50 {
teamScore += 3
} else {
teamScore += 1
}
}
teamScore
Условие внутри оператора
if
должно быть логическим, это в частности означает, что выражение if score {…}
является ошибочным, поскольку здесь нет явного сравнения (например, с нулем).Условный оператор if
можно использовать совместно с let
и var
для работы с константами и переменными, которые могут иметь значение nil
. Такие константы и переменные называются опциональными (то есть они могут либо принимать какое-либо значение, либо быть равны nil
). Чтобы создать опциональную переменную или константу добавьте знак вопроса (
) после указания типа.
var optionalString: String? = "Hello"
optionalString == nil
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}
Давайте поэкспериментируем
ИзменитеoptionalName
наnil
. Что вы видите на экране? Добавьте блокelse
для обработки случая, когдаoptionalName
равенnil
.
Если опциональное значение равно
nil
, условие будет ложным и код в фигурных скобках после if
выполнен не будет. В противном случае переменной greeting
будет присвоено новое значение.Оператор множественного выбора switch
поддерживает внутри себя множество других операторов сравнения и не ограничен лишь простыми сравнениями:
let vegetable = "red pepper"
switch vegetable {
case "celery":
let vegetableComment = "Add some raisins and make ants on a log."
case "cucumber", "watercress":
let vegetableComment = "That would make a good tea sandwich."
case let x where x.hasSuffix("pepper"):
let vegetableComment = "Is it a spicy \(x)?"
default:
let vegetableComment = "Everything tastes good in soup."
}
Давайте поэкспериментируем
Попробуйте удалить условие по умолчанию. Какую ошибку вы получите?
После выполнения подходящего блока кода, программа покидает оператор
switch
, не проверяя последующие условия. Таким образом вам не нужно вручную добавлять операторы прерывания (break
) в конце каждого блока case
.Для перебирания элементов ассоциативного массива используйте оператор for-in
совместно с указанием пары имен для каждой пары ключ-значение.
let interestingNumbers = [ "Prime": [2, 3, 5, 7, 11, 13], "Fibonacci": [1, 1, 2, 3, 5, 8], "Square": [1, 4, 9, 16, 25], ] var largest = 0 for (kind, numbers) in interestingNumbers { for number in numbers { if number > largest { largest = number } } } largest
Давайте поэкспериментируем
Добавьте еще одну переменную, которая позволит выяснить, к какому из трех типов относится найденное максимальное число.
Оператор цикла
while
позволяет выполнять блок кода внутри него до тех пор, пока условие не станет ложным. Условие также может быть указано после блока, который в таком случае будет выполнен по крайней мере один раз.var n = 2
while n < 100 {
n = n * 2
}
n
var m = 2
do {
m = m * 2
} while m < 100
m
Оператор
for
можно использовать для перебора последовательности чисел с помощью двух точек (..
) или с помощью инициализатора, условия и инкремента. Посмотрите, эти два цикла делают одно и то же:var firstForLoop = 0
for i in 0..3 {
firstForLoop += i
}
firstForLoop
var secondForLoop = 0
for var i = 0; i < 3; ++i {
secondForLoop += 1
}
secondForLoop
При создании цикла используйте две точки (
..
), если не хотите включать большее значение в диапазон, и три точки (…
), чтобы включить как меньшее, так и большее значения.Функции и замыкания.
Для объявления функций используйте ключевое слово
func
. Вызов функции производится через указание ее имени и списка аргументов в круглых скобках. Возвращаемый тип следует отделить от перечня формальных аргументов с помощью ->
.func greet(name: String, day: String) -> String {
return "Hello \(name), today is \(day)."
}
greet("Bob", "Tuesday")
Давайте поэкспериментируем
Удалите параметр day. Вместо него добавьте переменную, обозначающую наименование подаваемого на обед блюда.
Если функция возвращает множество значений, следует использовать кортеж:
func getGasPrices() -> (Double, Double, Double) {
return (3.59, 3.69, 3.79)
}
getGasPrices()
Функции также могут иметь неопределенное число аргументов:
func sumOf(numbers: Int...) -> Int {
var sum = 0
for number in numbers {
sum += number
}
return sum
}
sumOf()
sumOf(42, 597, 12)
Давайте поэкспериментируем
Напишите функцию, позволяющую находить среднее арифметическое произвольного числа своих аргументов.
Функции могут вкладываться друг в друга. Вложенная функция может обращаться к переменным, объявленным во внешней функции. Используйте вложенные функции, чтобы привести в порядок код сложной или большой функции.
func returnFifteen() -> Int {
var y = 10
func add() {
y += 5
}
add()
return y
}
returnFifteen()
Функции являются объектами первого класса (first-class type), иными словами, функция в качестве свого результата может возвращать другую функцию.
func makeIncrementer() -> (Int -> Int) {
func addOne(number: Int) -> Int {
return 1 + number
}
return addOne
}
var increment = makeIncrementer()
increment(7)
Функция также может принимать другую функцию в качестве одного из аргументов.
func hasAnyMatches(list: Int[], condition: Int -> Bool) -> Bool {
for item in list {
if condition(item) {
return true
}
}
return false
}
func lessThanTen(number: Int) -> Bool {
return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(numbers, lessThanTen)
Функции являются частным случаем замыканий. Вы можете создать замыкание, не указывая его имени и окружив тело замыкания фигурными скобками (
{}
). Для отделения аргументов и типа возвращаемого значения от тела замыкания используйте оператор in
.numbers.map({
(number: Int) -> Int in
let result = 3 * number
return result
})
Давайте поэкспериментируем
Перепишите замыкание таким образом, чтобы оно возвращало ноль для всех лишних чисел.
Существует несколько техник, позволяющих делать замыкания более лаконичными. Если тип замыкания априори известен (например, это callback делегата), можно опустить указание типа его параметров и/или типа возвращаемого значения. Замыкания, состоящие из единственного выражения, неявно возвращают результат этого выражения.
numbers.map({ number in 3 * number })
В замыкании вместо указания имени переменной, вы можете использовать ее порядковый номер – это особенно полезно при написании коротких замыканий. Замыкание, являющееся последним аргументом функции, может быть передано в нее сразу после круглых скобок с перечнем остальных параметров.
sort([1, 5, 3, 12, 2]) { $0 > $1 }
Объекты и классы
Для создания класса используется зарезервированное слово
class
. Члены класса объявляются точно так же, как и обычные константы и переменные. Более того, методы класса объявляются как обычные функции.class Shape {
var numberOfSides = 0
func simpleDescription() -> String {
return "A shape with \(numberOfSides) sides."
}
}
Давайте поэкспериментируем
Добавьте константу-член класса и метод класса, принимающую ее в качестве своего аргумента.
Чтобы создать экземпляр (объект) класса, достаточно добавить круглые скобки после названия класса. Доступ к методам и членам класса осуществляется через точку.
var shape = Shape()
shape.numberOfSides = 7
var shapeDescription = shape.simpleDescription()
В этом примере мы упустили одну важную деталь – конструктор класса, метод
init
.class NamedShape {
var numberOfSides: Int = 0
var name: String
init(name: String) {
self.name = name
}
func simpleDescription() -> String {
return "A shape with \(numberOfSides) sides."
}
}
Обратите внимание, как член класса name при помощи
self
отделен от аргумента конструктора name
. Аргументы передаются в конструктор обычным образом, как и в любой другой метод класса. Обратите внимание на то, что каждый член класса должен быть проинициализирован – либо при объявлении (как, например, numberOfSides
), либо в конструкторе (как name
).Деструктор класса – метод deinit
, который можно переписать в случае необходимости.
Чтобы наследовать класс от уже существующего класса, после указания имени дочернего класса следует поставить двоеточие и указать название родительского. В Swift нет никаких ограничений по обязательному наследованию какого-либо стандартного класса.
Переопределенные дочерним классом методы должны быть помечены ключевым словом override
– переопределение методов без override приведет к ошибке. Компилятор также выявляет методы, маркированные override
, но не переопределяющие какие-либо методы своего родительского класса.
class Square: NamedShape {
var sideLength: Double
init(sideLength: Double, name: String) {
self.sideLength = sideLength
super.init(name: name)
numberOfSides = 4
}
func area() -> Double {
return sideLength * sideLength
}
override func simpleDescription() -> String {
return "A square with sides of length \(sideLength)."
}
}
let test = Square(sideLength: 5.2, name: "my test square")
test.area()
test.simpleDescription()
Давайте поэкспериментируем
Создайте классCircle
и наследуйте его от классаNamedShape
. Конструктор классаCircle
принимает два аргумента – радиус и название. Переопределите методыarea
иdescribe
этого класса.
Члены класса могут также иметь собственные
getter
и setter
.class EquilateralTriangle: NamedShape {
var sideLength: Double = 0.0
init(sideLength: Double, name: String) {
self.sideLength = sideLength
super.init(name: name)
numberOfSides = 3
}
var perimeter: Double {
get {
return 3.0 * sideLength
}
set {
sideLength = newValue / 3.0
}
}
override func simpleDescription() -> String {
return "An equilateral triagle with sides of length \(sideLength)."
}
}
var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
triangle.perimeter
triangle.perimeter = 9.9
triangle.sideLength
В
setter
-е переменной perimeter
новое присваиваемое значение неявно называется newValue
. Вы можете изменить название этой переменной, указав его в скобках сразу после set
.Обратите внимание на структуру конструктора класса EquilateralTriangle
. Этот метод включает в себя три последовательных шага:
- инициализация членов дочернего класса;
- вызов конструктора родительского класса;
- изменение значений членов родительского класса.
Если вам необходимо выполнить определенный код до или после присваивания нового значения переменной, вы можете переопределить методы
willSet
и didSet
нужным вам образом. Например, в приведенном ниже классе гарантируется, что длина стороны треугольника всегда будет равна длине стороны квадрата.class TriangleAndSquare {
var triangle: EquilateralTriangle {
willSet {
square.sideLength = newValue.sideLength
}
}
var square: Square {
willSet {
triangle.sideLength = newValue.sideLength
}
}
init(size: Double, name: String) {
square = Square(sideLength: size, name: name)
triangle = EquilateralTriangle(sideLength: size, name: name)
}
}
var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape")
triangleAndSquare.square.sideLength
triangleAndSquare.triangle.sideLength
triangleAndSquare.square = Square(sideLength: 50, name: "larger square")
triangleAndSquare.triangle.sideLength
У методов классов имеется одно важное отличие от функций. Названия аргументов функции используются только в пределах этой функции, тогда как в методе класса параметры также используются при вызове этого метода (кроме первого параметра). По умолчанию метод класса имеет одинаковые названия параметров как при вызове, так и внутри себя. Однако вы можете указать другое название (в примере ниже –
times
), которое будет использовано только внутри этого метода. При этом для вызова этого метода необходимо использовать первое название (numberOfTimes
).class Counter {
var count: Int = 0
func incrementBy(amount: Int, numberOfTimes times: Int) {
count += amount * times
}
}
var counter = Counter()
counter.incrementBy(2, numberOfTimes: 7)
При работе с опциональными значениями добавьте знак вопроса (
?
) перед методами, членами класса и т.д. Если значение перед знаком вопроса равно nil
, все, что следует после (?
) игнорируется и значение всего выражения равно nil
. В противном случае выражение вычисляется обычным образом. В обоих случаях результатом всего выражения будет опциональное значение.let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square")
let sideLength = optionalSquare?.sideLength
Перечисления и Структуры
Для создания перечислений используется ключевое слово
enum
. Отметим, что перечисления также могут иметь в своем составе методы.enum Rank: Int {
case Ace = 1
case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
case Jack, Queen, King
func simpleDescription() -> String {
switch self {
case .Ace:
return "ace"
case .Jack:
return "jack"
case .Queen:
return "queen"
case .King:
return "king"
default:
return String(self.toRaw())
}
}
}
let ace = Rank.Ace
let aceRawValue = ace.toRaw()
Давайте поэкспериментируем
Напишите функцию, которая сравнивает 2 перечисления типаRank
по их значениям.
В вышеприведенном примере элементы перечисления первоначально имеют целочисленный тип, и вам достаточно указать значение только первого элемента – значения остальных элементов будут определены в соответствии с порядком их следования. В качестве исходного типа (raw value) значений элементов вы также можете выбрать строковый или вещественные типы.
Для преобразования исходного типа значения в тип перечисления используйте функции toRaw
и fromRaw
.
if let convertedRank = Rank.fromRaw(3) {
let threeDescription = convertedRank.simpleDescription()
}
Отметим, что значения элементов перечисления являются фактическими, а не просто иной записью своих исходных значений. Вообще говоря, вы можете и не указывать их исходные значения.
enum Suit {
case Spades, Hearts, Diamonds, Clubs
func simpleDescription() -> String {
switch self {
case .Spades:
return "spades"
case .Hearts:
return "hearts"
case .Diamonds:
return "diamonds"
case .Clubs:
return "clubs"
}
}
}
let hearts = Suit.Hearts
let heartsDescription = hearts.simpleDescription()
Давайте поэкспериментируем
Добавьте методColor
, возвращающий строку“black”
дляSpades
иClubs
и“red”
дляHearts
иDiamonds
.
Обратите внимание на то, как осуществляется доступ к члену
Hearts
перечисления Suit
. При присваивании значения константе hearts
используется полное имя Suit.Hearts
, поскольку мы явно не указываем тип этой константы. А в switch
мы используем сокращенную форму .Hearts
, поскольку тип значения self
априори известен. Вы можете использовать сокращенную форму повсеместно, если тип переменной явно указан.Для создания структур используется ключевое слово struct
. Структуры имеют множество схожих черт с классами, включая методы и конструкторы. Одним из наиболее существенных отличий структур от классов является то, что экземпляры структур, в отличие от экземпляров классов, передаются в функции по значению (то есть предварительно создается их локальная копия), тогда как экземпляры классов передаются по ссылке.
struct Card {
var rank: Rank
var suit: Suit
func simpleDescription() -> String {
return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
}
}
let threeOfSpades = Card(rank: .Three, suit: .Spades)
let threeOfSpadesDescription = threeOfSpades.simpleDescription()
Давайте поэкспериментируем
Добавьте в структуру Card метод, который создает полную колоду карт.
Экземпляр члена перечисления может иметь собственные значения и они могут быть разными. Вы присваиваете эти значения при создании экземпляра перечисления (константа
success
в примере). Связанные и исходные значения это разные вещи: исходное значение члена перечисления всегда постоянно для всех экземпляров перечисления и указывается при его объявлении.Рассмотрим пример получения с сервера времени восхода и заката Солнца. Сервер отправляет в ответ либо соответствующую информацию, либо сообщение об ошибке.
enum ServerResponse {
case Result(String, String)
case Error(String)
}
let success = ServerResponse.Result("6:00 am", "8:09 pm")
let failure = ServerResponse.Error("Out of cheese.")
switch success {
case let .Result(sunrise, sunset):
let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunset)."
case let .Error(error):
let serverResponse = "Failure... \(error)"
}
Давайте поэкспериментируем
Добавьте третий вариант в оператор множественного выбораswitch
Обратите внимание, каким образом из объекта
ServerResponse
“вытаскиваются” время восхода и заката.Протоколы и Расширения.
Для объявления протокола используйте ключевое слово
protocol
.protocol ExampleProtocol {
var simpleDescription: String { get }
mutating func adjust()
}
Протоколы могут поддерживаться классами, перечислениями и структурами.
class SimpleClass: ExampleProtocol {
var simpleDescription: String = "A very simple class."
var anotherProperty: Int = 69105
func adjust() {
simpleDescription += " Now 100% adjusted."
}
}
var a = SimpleClass()
a.adjust()
let aDescription = a.simpleDescription
struct SimpleStructure: ExampleProtocol {
var simpleDescription: String = "A simple structure"
mutating func adjust() {
simpleDescription += " (adjusted)"
}
}
var b = SimpleStructure()
b.adjust()
let bDescription = b.simpleDescription
Давайте поэкспериментируем
Создайте перечисление, которое будет реализовывать этот протокол.
Обратите внимание на ключевое слово
mutating
в определении структуры SimpleStructure
, которое информирует компилятор о том, что соответствующий метод подвергает структуру изменениям. В противовес этому методы класса SimpleClass
не нужно маркировать как mutating
, поскольку методы класса всегда могут беспрепятственно его изменять.Для добавления новых методов или членов класса в уже существующий тип необходимо использовать расширения – extensions
. Вы также можете использовать расширения для реализации протокола уже существующим типом, даже если он импортирован из какой-либо библиотеки или фреймворка.
extension Int: ExampleProtocol {
var simpleDescription: String {
return "The number \(self)"
}
mutating func adjust() {
self += 42
}
}
7.simpleDescription
Давайте поэкспериментируем
Создайте расширение типаDouble
с переменной-членомabsoluteValue
.
Вы можете использовать название протокола как и любой другой тип – например, чтобы создать массив объектов разного типа, но реализующих общий протокол. Заметьте, что при работе с объектами такого типа методы, объявленные вне протокола, будут недоступны.
let protocolValue: ExampleProtocol = a
protocolValue.simpleDescription
// protocolValue.anotherProperty // Uncomment to see the error
Несмотря на то, что во время выполнения программы переменная
protocolValue
имеет тип SimpleClass
, компилятор считает, что ее тип – ExampleProtocol
. Это означает, что вы не сможете случайно получить доступ к методам или членам класса, которые реализуются вне протокола ExampleProtocol
.Обобщенные типы (generics)
Для создания обобщенного типа, заключите имя в угловые скобки (
<>
).func repeat<ItemType>(item: ItemType, times: Int) -> ItemType[] {
var result = ItemType[]()
for i in 0..times {
result += item
}
return result
}
repeat("knock", 4)
Создавайте обобщенные функции, классы, перечисления и структуры.
// Reimplement the Swift standard library's optional type
enum OptionalValue<T> {
case None
case Some(T)
}
var possibleInteger: OptionalValue<Int> = .None
possibleInteger = .Some(100)
Если вы хотите задать обобщенные типу определенные требования, такие, как, например, реализация протокола или требование быть наследованным от определенного класса, используйте
where
.func anyCommonElements <T, U where T: Sequence, U: Sequence, T.GeneratorType.Element: Equatable, T.GeneratorType.Element == U.GeneratorType.Element> (lhs: T, rhs: U) -> Bool {
for lhsItem in lhs {
for rhsItem in rhs {
if lhsItem == rhsItem {
return true
}
}
}
return false
}
anyCommonElements([1, 2, 3], [3])
Давайте поэкспериментируем
Измените функциюanyCommonElements
таким образом, чтобы она возвращала массив общих элементов.
В простых случаях вы можете опустить
where
и написать имя протокола или класса после двоеточия. Выражение <T: Equatable>
эквивалентно выражению <T where T: Equatable>
.habr.com
Язык программирования Swift
Краткая справка
Swift – это невероятно мощный и простой язык программирования, представленный Apple в 2014 году, благодаря которому для многих программистов открывается возможность создания приложений для iOS, MacOS, Apple TV и Apple Watch. Данный язык унаследовал идеи от Objective-C, Rust, Haskell, Ruby, Python, C# и CLU. Он использует паттерны безопасного программирования и содержит новые функции, что позволяет сделать процесс программирования увлекательным и интересным. Созданный Крисом Латтнером, он вышел надежным, быстрым и открытым языком, благодаря чему стало еще проще создавать приложения для самого популярного телефона в мире.
Swift – это современный язык программирования со стабильной релизной версией, который достаточно прост в освоении, даже если учесть, что это ваш первый язык. Он предотвращает массу ошибок на этапе компиляции, ускоряет процесс разработки и повышает качество кода.
Философия Swift
Основной философией языка является его простота, быстродействие и защищенность. Порог вхождения изменился в большую сторону, по сравнению с тем же Objective C – даже не зная каких либо других языков программирования или основ, можно смело приступать к изучению языка.
Apple максимально упростила язык для разработчиков: синтаксис стал чище, что повышает читаемость кода как опытного, так и начинающего программиста. Общее количество кода уменьшилось, в следствии чего повысилась производительность. Были полностью переработаны, переосмыслены и переписаны все методы, которые использовались в Objective C. Swift постоянно развивается и обновляется, что говорит о его надежности и нацеленности на будущее.
Где применяется Swift
Данный язык программирования разработчики используют для написания мобильных приложений для телефонов, умных часов и компьютеров компании Apple. Ходил даже слух, что Google хочет перенести Android полностью на Swift, всякое может быть. Это универсальный язык, который можно использовать в любой платформе от компании из Купертино.
Важным моментом является то, что осенью 2016 года Apple способствовала открытию центра обучения студентов, где каждый может учиться программированию приложений для iOS. Но это еще не все, в штатах Swift уже включен в учебную программу многих ведущих учебных учреждений. У этого языка программирования огромный потенциал.
Сложность обучения Swift
Swift является безопасным языком, который позволит огородить вас от большинства ошибок в процессе программирования. Он подскажет, где находится ошибка и почему не компилируется программа. Но с другой стороны, тут кроется жесткая типизация. Язык от Apple не прощает ошибок.
На данный момент существует небольшое количество документации, по сравнению с другими языками. Но это можно обусловить тем, что язык совсем недавно увидел свет и стал Open Source проектом, ведь на момент релиза его могли использовать только те разработчики, у которых была активная подписка Apple Developer Program.
Еще раньше можно было сказать, что Swift не очень популярен и для него существует малое количество сторонних библиотек и расширений, но сейчас это совершенно не так. На GitHub и просторах интернета находятся десятки отличных решений от сторонних разработчиков, которые помогут усовершенствовать Ваш проект.
Плюсы/минусы Swift
У этого современного и мощного языка программирования есть ряд преимуществ, которые выделяют его на фоне других или того же Objective-C. И это новые мощные языковые возможности, предельно строгая типизация данных, более лаконичный синтаксис, существенно более высокая производительность в операциях доступа к коллекциям (сортировка и поиск), поддержка определенного большинства современных синтаксических конструкций, существующих в других высокоуровневых языках программирования. И одной из главных особенностей Swift является то, что он имеет полную обратную совместимость с Objective-C. Таким образом это позволяет постепенно переписывать проекты с одного языка на другой, к тому же дает возможность использовать функционал Objective-C внутри самого Swift.
Одним из приятных моментов является Playground – это своего рода интерактивная песочница, где разработчик может написать код и сразу увидеть результат своих трудов. Это позволяет в несколько раз увеличить скорость написания основного когда, ведь написание отдельных кусков кода или алгоритмов теперь можно проводить в плейграунде с визуальной обратной связью, без рисков совершения ошибок в основном проекте.
Apple переработала множество вещей, благодаря чему мы получили практически новую развитую систему перечисления, эффективное управление аксессорами и оптимизированную автоматическую сборку мусора.
Темной стороной языка является его небольшая популярность и небольшая распространённость. Большинство текущих проектов написаны на Objective-C и их придется поддерживать, да и многие компании не переписывают свои большие проекты только потому, что это огромный и невероятно трудоемкий процесс.
Сопутствующие технологии
Apple совершила переход от использования статических библиотек к динамическим и добавила этот функционал в свой язык программирования, что означает его более быстрое развитие, чем самой iOS. Теперь разработчики с легкостью могут представить свое приложение вместе с написанными ими библиотеками. Раньше требовалось ждать нового релиза iOS, но теперь ситуация изменилась. Динамические библиотеки предоставляют возможность для более гибких улучшений и изменений в коде, чем когда-либо.
Swift более функциональный и доступный язык, который как и Objective-C поддерживает официальные фреймворки Cocoa и Cocoa Touch. В сети доступно множество открытых проектов, в том числе от таких крупных компаний как Airbnb, которые позволяют использовать все современные методы и решения при написании кода.
vadimstroganov.com
Swift (язык программирования) — Википедия (с комментариями)
Материал из Википедии — свободной энциклопедии
У этого термина существуют и другие значения, см. Swift.Класс языка: | мультипарадигмальный ( протоколо-ориентированный, объектно-ориентированный, функциональный, императивный) |
---|---|
Появился в: | 2014 |
Расширение файлов: | .swift |
Выпуск: | 2.2.1[1] (2016-05-03; 942 дня тому назад) |
Тестовая версия: | 3.0 Snapshot (2016-02-08; 1027 дней тому назад) |
Основные реализации: | LLVM |
Испытал влияние: | Objective-C, C++, Java[2], Rust, Scala, Python, Ruby, Smalltalk, Groovy[3], язык D[4] |
Лицензия: | с версии 2.2 Open Source (Apache 2.0 with a Runtime Library Exception[5][6]) |
Сайт: | [swift.org rg] |
ОС: | macOS, iOS, tvOS, watchOS, Linux, Android |
Swift — открытый мультипарадигмальный компилируемый язык программирования общего назначения. Создан компанией Apple в первую очередь для разработчиков iOS и OS X. Swift работает с фреймворками Cocoa и Cocoa Touch и совместим с основной кодовой базой Apple, написанной на Objective-C. Swift задумывался как более легкий для чтения и устойчивый к ошибкам программиста язык, нежели предшествовавший ему Objective-C[7]. Программы на Swift компилируются при помощи LLVM, входящей в интегрированную среду разработки Xcode 6 и выше. Swift может использовать рантайм Objective-C, что делает возможным использование обоих языков (а также С) в рамках одной программы.
История
Старший вице-президент по разработке программного обеспечения Apple Крейг Федериги во время анонса этого продукта заявил, что язык программирования Swift был заложен ещё в платформе NeXT (ОС NeXTSTEP выпускалась в 1989—1995 годах), которая стала основой для OS X, а затем и iOS[8].
Разработка текущего варианта языка Swift началась в 2010 году Крисом Латтнером[en], руководителем отдела разработки инструментов для создания программного обеспечения 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].
Описание
Swift заимствовал довольно многое из Objective-C, однако он определяется не указателями, а типами переменных, которые обрабатывает компилятор. По аналогичному принципу работают многие скриптовые языки. В то же время, он предоставляет разработчикам многие функции, которые прежде были доступны в C++ и Java, такие как определяемые наименования, так называемые обобщения и перегрузка (overloading) операторов.
Часть функций языка выполняется быстрее по сравнению с другими подобными языками. Например, сортировка комплексных объектов выполняется в 3,9 раз быстрее, чем в Python, и почти в 1,5 раза быстрее, чем в Objective-C.[15][неавторитетный источник? 927 дней]
Код, написанный на Swift, может работать вместе с кодом, написанным на языках программирования C, Objective-C в рамках одного и того же проекта[2].
Swift репозитории
Apple разделила код 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 программ;
Пример кода
// Переменные var implicitInteger = 70 var implicitDouble = 70.0 var explicitDouble: Double = 70
// Константы let numberOfApples = 3 let numberOfOranges = 5 let appleSummary = "I have \(numberOfApples) apples." let fruitSummary = "I have \(numberOfApples + numberOfOranges) pieces of fruit."
print("Hello, world") let people = ["Anna": 67, "Beto": 8, "Jack": 33, "Sam": 25] for (name, age) in people { print("\(name) is \(age) years old.") }
См. также
Напишите отзыв о статье «Swift (язык программирования)»
Примечания
- ↑ [swift.org/download/#releases Swift.org — Download Swift]
- ↑ 1 2 [www.sotovik.ru/news/231735-apple-anonsirovala-novij-jazik-programmirovanija-swift.html Apple анонсировала новый язык программирования Swift] (рус.). Sotovik.ru (5 июня 2014). Проверено 5 июня 2014.
- ↑ Laforge, Guillaume. [glaforge.appspot.com/article/apple-s-swift-programming-language-inspired-by-groovy Apple’s Swift programming language inspired by Groovy] (англ.) (2 June 2014). Проверено 3 июня 2014.
- ↑ 1 2 [developer.apple.com/swift/blog/?id=15 Building assert() in Swift, Part 2: __FILE__ and __LINE__ — Swift Blog -]. Apple Developer. — «Swift borrows a clever feature from the D language: these identifiers expand to the location of the caller when evaluated in a default argument list.» Проверено 26 сентября 2014.
- ↑ [github.com/apple/swift/blob/master/LICENSE.txt swift/LICENSE.txt at master · apple/swift · GitHub]
- ↑ [www.apple.com/ru/pr/library/2015/12/03Apple-Releases-Swift-as-Open-Source.html Apple (Россия) — Информация для прессы — Apple открывает исходный код языка Swift]
- ↑ [www.3dnews.ru/821428 Главные задачи нового языка программирования Apple Swift — скорость и простота разработки] (рус.). 3DNews (3 июня 2014). Проверено 3 июня 2014.
- ↑ [www.3dnews.ru/821428 Главные задачи нового языка программирования Apple Swift — скорость и простота разработки] (рус.). 3DNews (3 июня 2014). Проверено 3 июня 2014.
- ↑ [nondot.org/sabre Chris Lattner’s Homepage] (June 3, 2014). — «I started work on the Swift Programming Language in July of 2010. I implemented much of the basic language structure, with only a few people knowing of its existence. A few other (amazing) people started contributing in earnest late in 2011, and it became a major focus for the Apple Developer Tools group in July 2013 […] drawing ideas from Objective-C, Rust, Haskell, Ruby, Python, C#, CLU, and far too many others to list.» Проверено 3 июня 2014.
- ↑ [itunes.apple.com/gb/book/swift-programming-language/id881256329?mt=11 The Swift Programming Language]. — Apple.
- ↑ [habrahabr.ru/post/259853/ Swift 2.0 будет с открытым кодом в конце года.] (рус.). Habrahabr (9 июня 2015). Проверено 9 июня 2015.
- ↑ [www.cnews.ru/news/top/2015-12-04_apple_otkryla_ishodnyj_kod_yazyka_swift Apple открыла исходный код своего «языка будущего».] (рус.). CNews (4 декабря 2015). Проверено 5 декабря 2015.
- ↑ [swift.org/about/ About Swift] — Официальный сайт.
- ↑ [androidlime.ru/apple-swift-for-android/ Android в скором будет поддерживать Apple Swift | AndroidLime]. androidlime.ru. Проверено 11 апреля 2016.
- ↑ [programmers.stackexchange.com/questions/242816/how-can-swift-be-so-much-faster-than-objective-c-in-these-comparisons How can Swift be so much faster than Objective-C in these comparisons?]. programmers.stackexchange.com. Проверено 18 мая 2016.
Ссылки
- [developer.apple.com/swift Описание Swift на официальном сайте Apple] (англ.).
- [developer.apple.com/swift/blog Официальный блог языка программирования] (англ.).
- [swift.org Официальный сайт языка программирования]
- [vk.com/JustDev Первое русскоязычное сообщество Swift]
- [swiftbook.ru Справочник языка Swift] (рус.).
- [blog.justdev.org Блог разработчиков Just Dev]
Отрывок, характеризующий Swift (язык программирования)
– Друг мой, маменька, – повторяла она, напрягая все силы своей любви на то, чтобы как нибудь снять с нее на себя излишек давившего ее горя.И опять в бессильной борьбе с действительностью мать, отказываясь верить в то, что она могла жить, когда был убит цветущий жизнью ее любимый мальчик, спасалась от действительности в мире безумия.
Наташа не помнила, как прошел этот день, ночь, следующий день, следующая ночь. Она не спала и не отходила от матери. Любовь Наташи, упорная, терпеливая, не как объяснение, не как утешение, а как призыв к жизни, всякую секунду как будто со всех сторон обнимала графиню. На третью ночь графиня затихла на несколько минут, и Наташа закрыла глаза, облокотив голову на ручку кресла. Кровать скрипнула. Наташа открыла глаза. Графиня сидела на кровати и тихо говорила.
– Как я рада, что ты приехал. Ты устал, хочешь чаю? – Наташа подошла к ней. – Ты похорошел и возмужал, – продолжала графиня, взяв дочь за руку.
– Маменька, что вы говорите!..
– Наташа, его нет, нет больше! – И, обняв дочь, в первый раз графиня начала плакать.
Княжна Марья отложила свой отъезд. Соня, граф старались заменить Наташу, но не могли. Они видели, что она одна могла удерживать мать от безумного отчаяния. Три недели Наташа безвыходно жила при матери, спала на кресле в ее комнате, поила, кормила ее и не переставая говорила с ней, – говорила, потому что один нежный, ласкающий голос ее успокоивал графиню.
Душевная рана матери не могла залечиться. Смерть Пети оторвала половину ее жизни. Через месяц после известия о смерти Пети, заставшего ее свежей и бодрой пятидесятилетней женщиной, она вышла из своей комнаты полумертвой и не принимающею участия в жизни – старухой. Но та же рана, которая наполовину убила графиню, эта новая рана вызвала Наташу к жизни.
Душевная рана, происходящая от разрыва духовного тела, точно так же, как и рана физическая, как ни странно это кажется, после того как глубокая рана зажила и кажется сошедшейся своими краями, рана душевная, как и физическая, заживает только изнутри выпирающею силой жизни.
Так же зажила рана Наташи. Она думала, что жизнь ее кончена. Но вдруг любовь к матери показала ей, что сущность ее жизни – любовь – еще жива в ней. Проснулась любовь, и проснулась жизнь.
Последние дни князя Андрея связали Наташу с княжной Марьей. Новое несчастье еще более сблизило их. Княжна Марья отложила свой отъезд и последние три недели, как за больным ребенком, ухаживала за Наташей. Последние недели, проведенные Наташей в комнате матери, надорвали ее физические силы.
Однажды княжна Марья, в середине дня, заметив, что Наташа дрожит в лихорадочном ознобе, увела ее к себе и уложила на своей постели. Наташа легла, но когда княжна Марья, опустив сторы, хотела выйти, Наташа подозвала ее к себе.
– Мне не хочется спать. Мари, посиди со мной.
– Ты устала – постарайся заснуть.
– Нет, нет. Зачем ты увела меня? Она спросит.
– Ей гораздо лучше. Она нынче так хорошо говорила, – сказала княжна Марья.
Наташа лежала в постели и в полутьме комнаты рассматривала лицо княжны Марьи.
«Похожа она на него? – думала Наташа. – Да, похожа и не похожа. Но она особенная, чужая, совсем новая, неизвестная. И она любит меня. Что у ней на душе? Все доброе. Но как? Как она думает? Как она на меня смотрит? Да, она прекрасная».
– Маша, – сказала она, робко притянув к себе ее руку. – Маша, ты не думай, что я дурная. Нет? Маша, голубушка. Как я тебя люблю. Будем совсем, совсем друзьями.
И Наташа, обнимая, стала целовать руки и лицо княжны Марьи. Княжна Марья стыдилась и радовалась этому выражению чувств Наташи.
С этого дня между княжной Марьей и Наташей установилась та страстная и нежная дружба, которая бывает только между женщинами. Они беспрестанно целовались, говорили друг другу нежные слова и большую часть времени проводили вместе. Если одна выходила, то другаябыла беспокойна и спешила присоединиться к ней. Они вдвоем чувствовали большее согласие между собой, чем порознь, каждая сама с собою. Между ними установилось чувство сильнейшее, чем дружба: это было исключительное чувство возможности жизни только в присутствии друг друга.
Иногда они молчали целые часы; иногда, уже лежа в постелях, они начинали говорить и говорили до утра. Они говорили большей частию о дальнем прошедшем. Княжна Марья рассказывала про свое детство, про свою мать, про своего отца, про свои мечтания; и Наташа, прежде с спокойным непониманием отворачивавшаяся от этой жизни, преданности, покорности, от поэзии христианского самоотвержения, теперь, чувствуя себя связанной любовью с княжной Марьей, полюбила и прошедшее княжны Марьи и поняла непонятную ей прежде сторону жизни. Она не думала прилагать к своей жизни покорность и самоотвержение, потому что она привыкла искать других радостей, но она поняла и полюбила в другой эту прежде непонятную ей добродетель. Для княжны Марьи, слушавшей рассказы о детстве и первой молодости Наташи, тоже открывалась прежде непонятная сторона жизни, вера в жизнь, в наслаждения жизни.
Они всё точно так же никогда не говорили про него с тем, чтобы не нарушать словами, как им казалось, той высоты чувства, которая была в них, а это умолчание о нем делало то, что понемногу, не веря этому, они забывали его.
Наташа похудела, побледнела и физически так стала слаба, что все постоянно говорили о ее здоровье, и ей это приятно было. Но иногда на нее неожиданно находил не только страх смерти, но страх болезни, слабости, потери красоты, и невольно она иногда внимательно разглядывала свою голую руку, удивляясь на ее худобу, или заглядывалась по утрам в зеркало на свое вытянувшееся, жалкое, как ей казалось, лицо. Ей казалось, что это так должно быть, и вместе с тем становилось страшно и грустно.
Один раз она скоро взошла наверх и тяжело запыхалась. Тотчас же невольно она придумала себе дело внизу и оттуда вбежала опять наверх, пробуя силы и наблюдая за собой.
Другой раз она позвала Дуняшу, и голос ее задребезжал. Она еще раз кликнула ее, несмотря на то, что она слышала ее шаги, – кликнула тем грудным голосом, которым она певала, и прислушалась к нему.
Она не знала этого, не поверила бы, но под казавшимся ей непроницаемым слоем ила, застлавшим ее душу, уже пробивались тонкие, нежные молодые иглы травы, которые должны были укорениться и так застлать своими жизненными побегами задавившее ее горе, что его скоро будет не видно и не заметно. Рана заживала изнутри. В конце января княжна Марья уехала в Москву, и граф настоял на том, чтобы Наташа ехала с нею, с тем чтобы посоветоваться с докторами.
После столкновения при Вязьме, где Кутузов не мог удержать свои войска от желания опрокинуть, отрезать и т. д., дальнейшее движение бежавших французов и за ними бежавших русских, до Красного, происходило без сражений. Бегство было так быстро, что бежавшая за французами русская армия не могла поспевать за ними, что лошади в кавалерии и артиллерии становились и что сведения о движении французов были всегда неверны.
Люди русского войска были так измучены этим непрерывным движением по сорок верст в сутки, что не могли двигаться быстрее.
Чтобы понять степень истощения русской армии, надо только ясно понять значение того факта, что, потеряв ранеными и убитыми во все время движения от Тарутина не более пяти тысяч человек, не потеряв сотни людей пленными, армия русская, вышедшая из Тарутина в числе ста тысяч, пришла к Красному в числе пятидесяти тысяч.
Быстрое движение русских за французами действовало на русскую армию точно так же разрушительно, как и бегство французов. Разница была только в том, что русская армия двигалась произвольно, без угрозы погибели, которая висела над французской армией, и в том, что отсталые больные у французов оставались в руках врага, отсталые русские оставались у себя дома. Главная причина уменьшения армии Наполеона была быстрота движения, и несомненным доказательством тому служит соответственное уменьшение русских войск.
Вся деятельность Кутузова, как это было под Тарутиным и под Вязьмой, была направлена только к тому, чтобы, – насколько то было в его власти, – не останавливать этого гибельного для французов движения (как хотели в Петербурге и в армии русские генералы), а содействовать ему и облегчить движение своих войск.
wiki-org.ru
ios — Swift — что за зверь?
На первый взгляд, очень похоже на C#, статически типизированный объектно-ориентированный язык. Вот список того, что есть в C# и появилось в Swift по сравнению с Objective C.
- Автоматический вывод типов переменных.
- Лямбды с нормальным синтаксисом, гораздо удобнее, чем блоки.
- Memory safety и отсутствие wild pointer’ов в качестве бонуса.
- Дженерики.
- Циклы наподобие
foreach
. - value types и reference types, структуры и классы
- Функции — объекты первого класса (раз уж есть лямбды…)
- type safety, отсутствие undefined behaviour
- Nullable
- Именованные аргументы функций, out-параметры (отречёмся от старого ми-и-ира!)
- string interpolation (будет в C# 6)
- поддержка safe-навигации (будет в C# 6)
Теперь преимущества:
- Есть
let
— объявление констант внутри тела функции. В C# есть такое лишь в ограниченном контексте (LINQ query syntax). Неясна точная семантика: это deep const или shallow const? Если deep, имеет ли объект право измениться сам по себе? - Синтаксическая поддержка инициализации списков, словарей и кортежей.
- Расширения (extensions) сильнее, чем Extension Methods из C#: добавляются статические методы, а также имплементируются протоколы. (Не знаю, как это соотносится с категориями Objective C.)
- Delegation — очень похоже на mix-in’ы, хочу такое в C#.
- Мощнейший
switch
с pattern matching’ом. - Вложенные функции! (Надеюсь, они наследуют контекст.)
- where-constraint в generic’ах мощнее
- Конструктор базового класса можно вызывать где угодно, не только в начале.
- AOP-образные
willSet
иdidSet
- Укороченный синтаксис для лямбд (
$1
etc.)
Отличия, забавные и серьёзные:
- Garbage collector’а нету, есть ARC. Ручная расстановка слабых ссылок и проблемы с closure в комплекте.
- Миленькие trailing closures.
- Методы по умолчанию виртуальные, как в Java.
- Массивы и словари — value type, копируются при передаче в качестве параметров.
- Более правильный порядок записи типов: тип после переменной, тип возвращаемого значения после аргументов
- Приятная конструкция
if let
для safe navigation.
Чего не увидел:
- Нет LINQ-образных lazy enumerations
event
‘ы? Без них программирование UI не очень удобно.- А где исключения? Опять пробрасывать
nil
? - Встроенная в язык поддержка многопоточности? Пора бы уже, 2014 год.
ru.stackoverflow.com
Зачем язык программирования Swift нужен Apple и вам — Look At Me
2 июня на конференции WWDC компания Apple представила новый язык программирования Swift. Разбираемся, зачем он нужен и почему разработчики возлагают на него такие большие надежды.
Что такое Swift?
Это новый язык программирования, разработанный Apple для создания приложений для iOS и OS X. Он построен на основе C и Objective-C, но более простой и гибкий. Кроме того, создатели Swift позаимствовали лучшие элементы языков программирования Javascript и Python.
Чем он лучше других языков программирования?
Разработчики Apple постарались создать максимально современный язык: Swift быстр (скорость реализации некоторых алгоритмов в 3,9 раза больше, чем на Python) и лаконичен (разработчики избавились от многословности Objective-C). Ещё одно важное нововведение — это возможность писать код и видеть результаты в режиме реального времени. До этого на протяжении долгого времени процесс создания продукта и сам продукт были разделены, и из-за этого программисты должны были тратить много времени на проверку и оптимизацию кода. В Swift они могут вносить поправки и сразу видеть результат. Это значит, что разработчики смогут быстрее проверять в деле свои концепты и в целом быстрее создавать приложения.
Как научиться программировать на этом языке?
Одновременно с релизом Swift Apple выпустила книгу о нём, которую можно бесплатно скачать в iTunes Store. Судя по реакции специалистов, многие из которых прочитали её в первые часы после презентации языка на WWDC, в ближайшие недели стоит ждать сотни видеотуториалов и обсуждений — первые паблики уже появились.
Зачем это Apple?
Во-первых, Swift — это ответ Apple на появление языка программирования Go, который разработала конкурирующая компания Google. С момента появления OS X Apple использовала только Objective-C, и появление Swift — это большой шаг в будущее. Во-вторых, создавая простой и современный язык, Apple надеется привлечь на свою сторону не только опытных разработчиков, которые уже умеют работать с Objective-C и C, но и новичков, которые наверняка используют данную им возможность и начнут изучать Swift. Рынок приложений снова вырастет, а значит, влияние Apple увеличится.
Flappy Bird уже воссоздали на языке Swift и выложили на GitHub
Что говорят эксперты?
Антон Домашнев
iOS-разработчик Look At Media
«О таком языке мечтали многие из программистов под iOS и OS X, потому что он удобнее Objective-C, но я не могу сказать, что Objective-C — плохой язык и сильно нуждался в замене. Однако мне определённо нравится то, что Swift намного более читаем, и код, написанный на Swift, будет в разы короче аналогичного кода на Objective-C, что увеличит скорость разработки. Судя по тому, что я увидел на WWDC, нам стоит ожидать бума на игры для iOS, так как Apple представила очень интересную утилиту Interactive Playgrounds, которая поспособствует увеличению интереса к разработке игр для девайсов Apple. Сегодня я начну читать учебник по этому языку — судя по тому, что было показано на презентации, переход на Swift не будет сложным, так как много конструкций похожи на те, которые мы используем сейчас в разработке на Objective-C. Новые свои проекты я собираюсь писать на Swift».
Владимир Бобров
Технический директор Look At Media
«Безусловно, релиз Swift — это крутой шаг как для компании Apple, так и для сообщества разработчиков. Новый язык позволит привлечь большее количество разработчиков за счёт снижения порога входа в экосистему разработки Apple, который был довольно высоким из-за языка Objective-C. Кроме этого, предложенный набор инструментов (Interactive Playgrounds, REPL) позволит быстрее отлаживать свои программы и игры. Полагаю, что свойства языка Swift и огромная поддержка со стороны Apple позволят ему добиться большой популярности в среде разработчиков ПО, ориентированных на массового пользователя».
Что ещё?
В Swift можно использовать эмодзи.
www.lookatme.ru
5 причин выучить язык программирования Apple Swift
Apple на открытии конференции разработчиков WWDC 2015 представила обновления своих ключевых платформ iOS 9 и OS X El Capitan. Но для разработчиков одним из самых важных анонсов стала вторая версия языка программирования Swift 2. Крейг Федериги в ходе презентации продукта заявил, что Apple постаралась создать язык, который был бы избавлен от громоздкого наследия Objective-C. Swift был заложен в платформе NeXt, которая стала основой для OS X, а затем и iOS.
Swift – действительно удобный и мощный язык, который претендует не только на то, чтобы заменить Objective-C в экосистеме Apple, но и посягнуть на всё семейство C в целом. Блогер Антон Мухатаев, изучающий несколько языков программирования, назвал пять преимуществ Apple Swift для начинающих пользователей. Среди них легко читаемый синтаксис, понятные конструкции, безопасность и нехватка опытных программистов на Swift.
1. По-настоящему опытных разработчиков на Swift до сих пор нет
Учиться и переучиваться приходится всем без исключения. Если вы займётесь Swift в 2015-м, то спустя сколько угодно лет будете отставать от самых опытных программистов в худшем случае на год. Преимущество опытных кодеров только в том, что Swift заимствует лучшие элементы других языков — тем, кто их знает, легче его освоить.
2. Это молодой язык программирования
В новых версиях Swift по-прежнему происходят фундаментальные изменения в синтаксисе и типах данных. Язык взрослеет на глазах, и так легче понимать логику перемен — а при желании можно и помочь в его доработке. Конечно, кто-то может назвать это недостатком, учитывая, что проекты, написанные на более старых версиях Swift, не работают на новых — но миграция занимает не так много времени, а синтаксис становится только проще.
3. Это безопасный язык программирования
В основе Swift — желание оставить как можно меньше уязвимостей и максимально обезопасить код от ошибок. Программист не обязан всё держать в голове и следить за всем. Это необходимо в C-подобных языках, и если раньше это было обоснованным, потому что они работали быстрее других, то Swift догоняет по производительности даже C++ — и ведь чем дальше, тем лучше он будет оптимизирован. Программист, который пишет код на Swift, лишён огромного количества головной боли, связанной с менеджментом памяти и другими вещами.
4. Легко читаемый синтаксис, вдохновленный Python и Ruby.
Swift – легко читаемый язык, как и Python. Основное отличие в том, что блоки отделяются не отступами, а фигурными скобками — так привычнее и удобнее.
5. Apple открывает исходный код Swift
Apple объявила на WWDC 2015, что до конца года Swift станет языком с открытым исходным кодом. Это значит не только то, что в его доработке Apple будет ещё сильнее опираться на сообщество разработчиков, но и то, что в потенциале он станет воистину мультиплатформенным, а не будет ограничиваться экосистемой Apple. Иначе говоря, если вы разрабатываете приложение на Swift для iOS, то есть перспектива того, что вы сможете перенести его на Android, и вам не нужно будет учить Java, используемый операционной системой Google.
Наконец, это красивый язык. Очень субъективно, конечно, но код на Swift выглядит красиво — чего не скажешь о том же Objective-C с его бесконечными нагромождениями. А главное, что красота и удобство не сказываются на мощности.
Руководство по языку программирования доступно бесплатно в iTunes, информация о языке есть и на сайте компании для разработчиков.
Следите за новостями Apple в нашем Telegram-канале, а также в приложении MacDigger на iOS.
Присоединяйтесь к нам в Twitter, ВКонтакте, Facebook, Google+ или через RSS, чтобы быть в курсе последних новостей из мира Apple, Microsoft и Google.
Поделись этой статьей с друзьями
www.macdigger.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