Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СЕССИЯ ОТВЕТЫ / iOS сессия ответы.docx
Скачиваний:
21
Добавлен:
25.12.2020
Размер:
14.45 Mб
Скачать

Неявные возвраты из замыканий с одним выражением

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

reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )

Здесь тип функции sorted(by:)аргумента метода проясняет, что Boolзначение должно быть возвращено замыканием. Поскольку тело замыкания содержит единственное выражение ( ), которое возвращает значение, двусмысленности нет, и ключевое слово может быть опущено.s1 > s2Boolreturn

Сокращенные имена аргументов

Swift автоматически предоставляет сокращенные имена аргументов встраивать затворы, которые могут быть использованы для обозначения значений аргументов замыкания по именам $0, $1, $2и так далее.

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

reversedNames = names.sorted(by: { $0>$1 } )

Здесь $0и $1ссылаются на первый и второй Stringаргументы замыкания .

35 Переменные-замыкания. Метод сортировки массивов.

Создание нового отсортированного массива#

Поскольку Array соответствует SequenceType , мы можем создать новый массив отсортированных элементов, используя встроенный метод сортировки.

2.1 2.2

В Swift 2 это делается с помощью метода sort() .

let sorted = array.sort() // [1, 2, 3]

3.0

С Swift 3 онбылпереименованв sorted() .

let sorted = array.sorted() // [1, 2, 3]

Сортировка существующего массива на месте#

Поскольку Array соответствует MutableCollectionType , мы можем сортировать его элементы на месте.

2.1 2.2

В Swift 2 это выполняется с помощью sortInPlace() .

array.sortInPlace() // [1, 2, 3]

3.0

С Swift 3 онбылпереименованв sort() .

array.sort() // [1, 2, 3]

Примечание. Чтобы использовать вышеуказанные методы, элементы должны соответствовать протоколу Comparable .

Сортировка массива с пользовательским заказом#

Вы также можете отсортировать массив, используя закрытие, чтобы определить, должен ли один элемент быть заказан другим, - который не ограничивается массивами, где элементы должны быть Comparable . Например, для Landmark не Comparable но вы все равно можете отсортировать массив ориентиров по высоте или имени.

struct Landmark {

let name : String

let metersTall :Int

}

var landmarks = [Landmark(name: "Empire State Building", metersTall: 443),

Landmark(name: "Eifell Tower", metersTall: 300),

Landmark(name: "The Shard", metersTall: 310)]

2.1 2.2

// sort landmarks by height (ascending)

landmarks.sortInPlace {$0.metersTall < $1.metersTall}

print(landmarks) // [Landmark(name: "Eifell Tower", metersTall: 300), Landmark(name: "The Shard", metersTall: 310), Landmark(name: "Empire State Building", metersTall: 443)]

// create new array of landmarks sorted by name

let alphabeticalLandmarks = landmarks.sort {$0.name < $1.name}

print(alphabeticalLandmarks) // [Landmark(name: "Eifell Tower", metersTall: 300), Landmark(name: "Empire State Building", metersTall: 443), Landmark(name: "The Shard", metersTall: 310)]

3.0

// sort landmarks by height (ascending)

landmarks.sort {$0.metersTall < $1.metersTall}

// create new array of landmarks sorted by name

let alphabeticalLandmarks = landmarks.sorted {$0.name < $1.name}

Примечание. Сравнение строк может дать неожиданные результаты, если строки непоследовательны, см

36.Замыкания - это тип-ссылка.Автозамыкания.

Замыкания - ссылочный тип

Функциональный тип данных — это ссылочный тип (referencetype). Это значит, что замыкания передаются не копированием, а с помощью ссылки на область памяти, где хранится это замыкание.

В примере выше incrementBySeven и incrementByTen константы, но замыкания, на которые ссылаются эти константы имеют возможность увеличивать значение переменных runningTotal, которые они захватили. Это из-за того, что функции и замыкания являются ссылочными типами.

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

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

letalsoIncrementByTen = incrementByTen

alsoIncrementByTen()

//возвращает 50

incrementByTen()

//возвращает 60

Пример выше показывает, что вызов alsoIncrementByTen то же самое, что и вызов incrementByTen. Потому что и та и другая функция ссылаются на одно и то же замыкание: и то, и другое замыкание возвращают один и тот же runningTotal.

Автозамыкания — это замыкания, которые автоматически создаются из переданного выражения. Иными словами, может существовать функция, имеющая один или несколько входных параметров, которые при ее вызове передаются как значения, но во внутренней реализации функции используются как самостоятельные замыкания

Для реализации автозамыкания необходимо следующее: ‰ Входной аргумент должен иметь функциональный тип. В примере, приведенном ранее, аргумент nextName уже имеет функциональный тип ()->String. ‰ Функциональный тип не должен определять типы входных параметров.

37.Выходящие замыкания.

Замыкания – это блоки кода, которые могут быть многократно использованы. Понимание принципа работы замыканий является ключевым аспектом обучения в разработке под iOS.

Выражения замыкания в Swift имеют четкий, ясный, оптимизированный синтаксис в распространенных сценариях. Эти оптимизации включают:

  • Вывод типа параметра и возврат типа значения из контекста

  • Неявные возвращающиеся значения однострочных замыканий

  • Сокращенные имена параметров

  • Синтаксис последующих замыканий

Когда замыкание является последним или единственным параметром функции, вы можете написать код замыкания вне скобок функции. Это называется выходящее замыкание (tralingclosure).

names.sorted{ $0< $1}

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

Соседние файлы в папке СЕССИЯ ОТВЕТЫ