some vs any (opaque types vs existentials)?
Суть
some P— opaque type: за ним стоит ровно один конкретный тип, который знает компилятор, но скрывает от вызывающего кода. Нулевые накладные расходы, статическая диспетчеризация, сохраняется идентичность типа (some Equatableможно сравнивать между вызовами одной функции).any P— экзистенциал: контейнер, в котором в рантайме может лежать любой тип, соответствующийP. Динамическая диспетчеризация через witness table, возможный boxing в кучу, иany Pсам не соответствуетP.
protocol Shape { func area() -> Double }
struct Circle: Shape { let r: Double; func area() -> Double { .pi * r * r } }
struct Square: Shape { let side: Double; func area() -> Double { side * side } }
func unitCircle() -> some Shape { Circle(r: 1) } // один скрытый тип
func describe(_ s: some Shape) -> Double { s.area() } // = <S: Shape>(_ s: S)
let shapes: [any Shape] = [Circle(r: 1), Square(side: 2)] // разные типы
let ints: any Collection<Int> = [1, 2, 3] // constrained existential
func pick(_ big: Bool) -> some Shape {
// if big { return Square(side: 2) } else { return Circle(r: 1) }
// error: function declares an opaque return type, but the return
// statements in its body do not have matching underlying types
Circle(r: big ? 2 : 1)
}
_ = describe(shapes[0]) // implicit opening: any Shape → generic S (SE-0352)
Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.
Полный ответ — в DevPrep