Назад к вопросам
Middle
80
questionbank

Что произойдет, если класс будет помечен как Objective-C?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Класс, помеченный атрибутом @objc, становится доступным из Objective-C кода. Это обеспечивает интероперабельность между Swift и Objective-C.

Ключевые аспекты:

  1. Доступность из Objective-C: Методы, свойства и инициализаторы этого класса могут быть вызваны из Objective-C.
  2. Динамическая диспетчеризация: @objc часто подразумевает динамическую диспетчеризацию, то есть вызов метода определяется во время выполнения, а не во время компиляции. Это необходимо для некоторых Objective-C фич, таких как Key-Value Observing (KVO), Objective-C Runtime и @dynamic.
  3. Наследование от NSObject: Чтобы класс был полностью доступен из Objective-C, он обычно должен наследоваться от NSObject. Классы, не наследующие от NSObject, также могут быть помечены @objc, но их функциональность в Objective-C может быть ограничена.
  4. Селекторы: Методы @objc классов могут использоваться с селекторами (#selector), что критично для Target-Action паттерна, NSTimer и NotificationCenter в стиле Objective-C.
  5. Переименование: При экспорте в Objective-C имена Swift классов, методов и свойств могут быть изменены. Атрибут @objc позволяет явно указывать имя Objective-C с помощью @objc(<ObjCName>).

Пример:

import Foundation

@objc(MySwiftClass) // Explicitly name it MySwiftClass in Objective-C
class MyClass: NSObject {
    @objc var myProperty: Int = 0 // Accessible from Objective-C

    @objc func myMethod(value: Int) { // Accessible from Objective-C
        print("Value: \(value)")
    }

    // Not accessible as a method from Objective-C by default
    func swiftOnlyMethod() {
        print("Swift only")
    }
}

В результате этот Swift класс будет виден в Objective-C как MySwiftClass с доступными свойствами myProperty и методом myMethodWithIntValue:.