programing

스위프트에서 @objc를 언제 사용해야 합니까?

muds 2023. 8. 24. 22:30
반응형

스위프트에서 @objc를 언제 사용해야 합니까?

Swift에서는 다음과 같은 몇 가지 방법을 확인할 수 있습니다.

@objc private func doubleTapGestureRecognized(recognizer: UITapGestureRecognizer)

@objc는 언제 사용해야 하나요?나는 몇몇 문서를 읽었지만, 그들은 당신이 목표-C에서 그것을 호출하기를 원할 때, 당신은 @objc 플래그를 추가해야 한다고 말합니다.

하지만 이것은 Swift의 개인 기능입니다, @obj는 무엇을 합니까?

또 다른 늦은 답변이지만, 이 질문에 대한 기존 답변은 OP의 질문에 실제로 대답하는 것은 없습니다. "대체 왜 당신이 사용해야 하는 겁니까?@objc에서.private 구성원, 학구원성약, 만급약.@objcObjective-C와 상호 작용하기 위한 것이 있으며, 해당 멤버는 비공개이며, 프로젝트에 Objective-C 코드가 있더라도 멤버를 볼 수 없어야 한다는 의미입니까?

그 이유는 많은 프레임워크가 Objective-C로 작성되어 있기 때문에 특정 API와 상호 작용하기 위해 Objective-C 기능이 필요할 때가 있기 때문입니다.

예를 들어, 다음을 통해 알림을 등록하려고 합니다.DistributedNotificationCenter:

DistributedNotificationCenter.default.addObserver(self,
                                                  selector: #selector(somethingHappened(_:)),
                                                  name: someNotification,
                                                  object: nil)

이것이 작동하려면, 우리는 선택기를 사용할 수 있어야 합니다.somethingHappened방법. .그러나 선택기는 목표-C 개념이므로 방법이 목표-C에 표시되지 않으면 선택기가 없습니다.이 는 안 되는 에도 그므로, 메가비고임외의호코부의는, ▁an▁is▁need▁therefore다▁method▁it▁will것니입▁if▁the▁even▁and,그필할요▁private▁by▁code것▁outside,그▁should가 필요합니다.@objc의순로의 DistributedNotification선택기를 통해 호출할 수 있도록 목표-C로 작성된 코드입니다.

또 다른 일반적인 경우는@objcKVC "KVO" KVC "MacOS (Key-Value Coding)" 이는 KVC 가 있습니다.KVC는 코코아의 다른 많은 시스템과 마찬가지로 Objective-C에 구현되어 있으며, 이는 KVC 호환 속성이 Objective-C 런타임에 노출되도록 요구하는 효과가 있습니다.때로는 KVC 호환 속성을 비공개로 하는 것이 타당합니다.한 를 들 수 .

@objc private dynamic var originalProperty: String

@objc private static let keyPathsForValuesAffectingDependentProperty: Set<String> = [
    #keyPath(originalProperty)
]
@objc public var dependentProperty: String { return changeItSomehow(self.originalProperty) }

이 경우 실제 저장된 속성은 비공개이지만 외부 코드에 노출되는 종속 속성은 비공개 속성이 업데이트될 때 알림을 보내야 합니다.사유 재산을 다음과 같이 표시함으로써@objc 이 할 수 의 KVC 종여쉽이수수있다니습에 을 보내는 . 그렇지 않으면 개인 자산의 주소에 있는 알림을 수동으로 전송하는 코드를 작성해야 합니다.willSet그리고.didSet또한에 "KVC"라는 것을 입니다.dependentProperty는 에의합다에 되어 있습니다.originalPropertyKVC 시스템이 Objective-C에 노출되어 KVC 시스템을 찾아 호출해야 하지만, 우리 코드의 클라이언트와는 관련이 없습니다.

또한 코코아 바인딩을 구현 세부 정보로 사용하여 보기의 컨트롤을 업데이트하는 macOS 앱의 뷰 컨트롤러는 특정 개인 속성을 KVC 호환으로 만들어 해당 컨트롤을 바인딩할 수 있습니다.

따라서 보시는 바와 같이, 코드의 클라이언트에 보일 필요 없이 프레임워크와 상호 작용하기 위해 메서드나 속성이 Objective-C에 노출되어야 할 때가 있습니다.

private는 Swift에서만 볼 수 있다는 의미이므로 @objc를 사용하여 목표-C에서 볼 수 있습니다.개인 기능을 신속하게 선택할 수 있는 기능이 있는 경우 필수입니다.

@objc 속성은 Swift API를 Objective-C와 Objective-C 런타임에서 사용할 수 있게 합니다.

참조: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html

@objc / 동적인

호환성을 위한 것입니다.일단 당신의 Swift 파일/코드를 Objective-C 기반 프로젝트로 가져오면 됩니다.

그리고 Objective-C 코드 또는 클래스로 속성/메소드에 액세스하려면 이 옵션을 사용합니다.

대부분의 경우 Swift 클래스의 Objective-C 기본 클래스를 하위 분류할 때 발생합니다.

Swift 클래스 또는 프로토콜은 Objective-C에서 액세스할 수 있고 사용할 수 있으려면 @objc 특성으로 표시되어야 합니다.이 속성은 컴파일러에게 이 Swift 코드 조각이 Objective-C에서 액세스할 수 있음을 알려줍니다.Swift 클래스가 Objective-C 클래스의 하위 클래스인 경우 컴파일러는 자동으로 @objc 속성을 추가합니다.

여기 사과 문서에는 다음과 같은 내용이 나와 있습니다.@objc.

목표-C의 Swift 사용

언어 상호 운용성 호환성

업데이트된 링크:
애플이 링크를 업데이트한 것 같습니다.

@objc는 클래스 속성이므로 다음을 사용합니다.

@objc public class MyClass

클래스의 메서드를 Objective C 클래스에 노출하므로 클래스에 공용 함수가 포함된 경우에만 사용할 수 있습니다.

, 이 늦은답, 나이것러.@objcSwift 4(일반적으로 10일 전에 출시된 Xcode 9에서 출시됨)를 기점으로 동작이 조금씩 변화하고 있습니다.

에서, 스프에서 4트몇, 추사례은들론의 몇몇 .@objc은 단지 에, 앞에 있는 합니다.@objc헤더는 스위프트 컴파일러에 의해 추론되었지만, 그것은 추론되지 않은 스위프트 4에 있습니다.

이러한 변화에 대한 Swift의 진화 제안을 자세히 읽어 보십시오.

앞에서 언급한 바와 같이 일반적으로@objc특정 메소드를 목적-C 런타임에 노출시키는 것으로, Swift의 상호 운용성 언어의 일부입니다.

Swift @objc vs @objc 멤버스

@objc을 선문을에공다니에 시킵니다.Objective-C runtime[정보]어디 보자꾸나#selector[정보] 목적-C 런타임을 사용하는 Swift의 기능입니다.이 경우 Swift를 정의할 수 있습니다.@objc private func[더 보기]

목표-C에서 Swift의 기능을 사용하려면:

  1. 스위프트의 클래스는 에서 확장되어야 합니다.
  2. Mark Swift:

@objcMembers 클래스만 - 모두 표시 public 생성자, 필드메서드.또한 하위 클래스에도 적용 가능합니다.

@objc 클래스/클래스/클래스(구조체 [이름 지정 유형]제외)

  • @objc class(선택 사항) - 기본값표시합니다. public init()또는@objc(<custom_name>)클래스의 사용자 지정 이름을 설정합니다.
  • @objc 생성자, 필드방법 - 선택적으로 노출

Swift의 메소드는 다음 명명 시 사용할 수 있습니다.

<swiftName>With<firstArgument>:<secondArgument>:

예:

public func printHelloWorld(arg1: String, arg2:String)
//is reached through: 
[someObject printHelloWorldWithArg1: arg2:];

[@objc그리고.dynamic]

언급URL : https://stackoverflow.com/questions/30795117/when-to-use-objc-in-swift

반응형