DevPrep

Все темы › Язык Swift

Можно ли использовать @objc в структуре? Почему?

Middle PRO

Суть

Нет. @objc делает член видимым для Objective-C runtime, а тот умеет работать только с объектами: указатель isa на класс, таблица методов класса, поиск по селектору через objc_msgSend. У структуры ничего этого нет — это value-тип, который лежит прямо на стеке или внутри другого значения, копируется побитово и не имеет идентичности. Компилятор так и скажет: '@objc' can only be used with members of classes, @objc protocols, and concrete extensions of classes.

import Foundation

struct Point { var x = 0.0, y = 0.0 }
// @objc struct Point {}            // error: '@objc' can only be applied
//                                  //        to classes
// struct S { @objc func f() {} }   // error: '@objc' can only be used
//                                  //        with members of classes...

final class PointBox: NSObject {    // мост для Obj-C: оборачиваем в класс
    let point: Point
    init(_ point: Point) { self.point = point }
    @objc var x: Double { point.x }
}

Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.

Полный ответ — в DevPrep

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

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

Скачать DevPrep в App Store