Обобщённые функции
Часть раздела Объектно-ориентированное программирование путешествия по Swift на Coddy. Урок 34 из 57.
Обобщённая функция работает с любым типом. Заполнитель в угловых скобках, часто T, обозначает тип, который использует вызывающий код, а Swift подставляет его при каждом вызове:
func firstAndLast<T>(_ items: [T]) -> [T] {
guard let first = items.first, let last = items.last else { return [] }
return [first, last]
}
print(firstAndLast([3, 8, 1]))
print(firstAndLast(["a", "b", "c"]))Вывод:
[3, 1]
["a", "c"]Внутри функции ничего не известно о T, поэтому разрешены только операции, работающие для любого типа. Такое ограничение, как T: Comparable, позволяет выполнять больше операций — в данном случае использовать оператор <:
func largest<T: Comparable>(_ items: [T]) -> T? {
guard var best = items.first else { return nil }
for item in items where item > best { best = item }
return best
}
print(largest([4, 9, 2])!)
print(largest(["pear", "apple", "zucchini"])!)Результат:
9
zucchiniОбобщения сохраняют точный тип, в отличие от Any. Результат вызова largest для [Int] имеет тип Int?, поэтому его можно использовать в арифметических операциях без приведения типа:
func largest<T: Comparable>(_ items: [T]) -> T? {
items.max()
}
let top = largest([3, 7, 5]) ?? 0
print(top * 10)Вывод:
70Функция может иметь несколько заполнителей, а ограничения могут указывать протоколы, созданные вами:
protocol Scored { var score: Int { get } }
struct Player: Scored { let name: String; let score: Int }
struct Team: Scored { let score: Int }
func total<T: Scored>(_ items: [T]) -> Int {
items.reduce(0) { $0 + $1.score }
}
func pair<A, B>(_ a: A, _ b: B) -> String { "\(a) & \(b)" }
print(total([Player(name: "a", score: 3), Player(name: "b", score: 4)]))
print(total([Team(score: 10)]))
print(pair(1, "one"))Вывод:
7
10
1 & oneЗадание
ЛегкоНапиши обобщённую функцию countWhere(_:_:), которая принимает массив любого типа и предикат (T) -> Bool, возвращает количество элементов, удовлетворяющих условию, а также функцию mostCommon(_:), которая принимает массив любого типа Hashable и возвращает его наиболее часто встречающийся элемент (тот, который появляется первым в массиве, если количества совпадают) или nil для пустого массива.
Предоставленный код считывает строку со словами, разделёнными запятыми, и строку с числами. Он выводит количество слов длиной более 3 символов, наиболее часто встречающееся слово, количество чётных чисел и наиболее часто встречающееся число.
Твой код должен находиться в Functions.swift. В main.swift содержится предоставленный код ввода/вывода, и его нельзя изменять.
Попробуйте сами
// Предоставленный код ввода/вывода: оставьте его как есть
var input: [String] = []
while let line = readLine() { input.append(line) }
let words = input[0].split(separator: ",").map(String.init)
let numbers = input[1].split(separator: ",").map { Int($0)! }
print(countWhere(words) { $0.count > 3 })
print(mostCommon(words) ?? "none")
print(countWhere(numbers) { $0 % 2 == 0 })
print(mostCommon(numbers).map { String($0) } ?? "none")
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Классы и объекты
Работа с файламиОпределение классовМетоды и selfИнициализаторыКлассы — это ссылкиПовторение — читательский билет4Инкапсуляция
Контроль доступаТолько чтение извнеЗащита состоянияИнициализаторы с возможностью сбояПовторение — банковский счёт7Полиморфизм и обобщения
ПолиморфизмПриведение типовОбобщённые функцииОбобщённые типыПовторение — калькулятор фигур10Паттерны проектирования. Часть 2
Паттерн делегированияПаттерн декораторПаттерн строительПаттерн состояния2Структуры и типы-значения
СтруктурыСемантика значенийИзменяющие методыСтруктура или классПовторение — элемент инвентаря5Наследование
ПодклассыПереопределение методовИнициализаторы и superfinal и иерархииПовторение — иерархия сотрудников8Стандартные протоколы
CustomStringConvertibleEquatableComparableHashableПовторение — пользовательская сортировка11Проект: Управление библиотекой
Книги и читателиВыдача книгПотренируйтесь самостоятельно: Песочница Swift