Что делает метод `some` для коллекций в Swift?

«Что делает метод `some` для коллекций в Swift?» — вопрос из категории Swift Core, который задают на 23% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Внимание: В стандартной библиотеке Swift нет метода some. Вероятно, имеется в виду метод contains(where:) или концепция непрозрачного типа some, используемая с протоколами.

1. Если вопрос о проверке условия в коллекции (contains(where:)):

Этот метод проверяет, удовлетворяет ли хотя бы один элемент коллекции заданному предикату (замыканию).

let numbers = [1, 3, 5, 8, 9]

// Проверяем, есть ли хотя бы одно четное число
let hasEvenNumber = numbers.contains { $0 % 2 == 0 }
print(hasEvenNumber) // true (число 8 четное)

// Проверяем, есть ли число больше 10
let hasLargeNumber = numbers.contains { $0 > 10 }
print(hasLargeNumber) // false

// Для пустого массива всегда возвращается false
let emptyArray: [Int] = []
print(emptyArray.contains { $0 > 0 }) // false

2. Если вопрос о непрозрачном типе some (возвращаемый тип):

Ключевое слово some используется для объявления непрозрачного типа (opaque type), который скрывает конкретный тип возвращаемого значения, гарантируя при этом, что он соответствует указанному протоколу.

protocol Shape {
    func area() -> Double
}

struct Square: Shape { /* ... */ }
struct Circle: Shape { /* ... */ }

// Функция возвращает `some Shape` — конкретный тип (Square или Circle) скрыт.
func makeShape(isRound: Bool) -> some Shape {
    return isRound ? Circle(radius: 5) : Square(side: 10)
    // Ошибка: нельзя возвращать разные типы в разных ветках.
    // Тип должен быть одним и тем же конкретным типом, известным компилятору.
}

let shape = makeShape(isRound: true) // Тип shape — `some Shape` (на самом деле Circle)
print(shape.area())

Итог:

  • Для проверки условия в коллекции используйте contains(where:).
  • Ключевое слово some используется для объявления непрозрачного возвращаемого типа, соответствующего протоколу.