DevPrep

Все темы › Современный Swift

some vs any (opaque types vs existentials)?

Senior PRO

Суть

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

Потренируйтесь перед собеседованием

В DevPrep эти ответы превращаются в задачи на минуту: что напечатает код, найди баг, пробное собеседование. По задаче в день.

Скачать DevPrep в App Store