스위프트에서 @objc를 언제 사용해야 합니까?
Swift에서는 다음과 같은 몇 가지 방법을 확인할 수 있습니다.
@objc private func doubleTapGestureRecognized(recognizer: UITapGestureRecognizer)
@objc는 언제 사용해야 하나요?나는 몇몇 문서를 읽었지만, 그들은 당신이 목표-C에서 그것을 호출하기를 원할 때, 당신은 @objc 플래그를 추가해야 한다고 말합니다.
하지만 이것은 Swift의 개인 기능입니다, @obj는 무엇을 합니까?
또 다른 늦은 답변이지만, 이 질문에 대한 기존 답변은 OP의 질문에 실제로 대답하는 것은 없습니다. "대체 왜 당신이 사용해야 하는 겁니까?@objc
에서.private
구성원, 학구원성약, 만급약.@objc
Objective-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로 작성된 코드입니다.
또 다른 일반적인 경우는@objc
KVC "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
는 에의합다에 되어 있습니다.originalProperty
KVC 시스템이 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
@objc / 동적인
호환성을 위한 것입니다.일단 당신의 Swift 파일/코드를 Objective-C 기반 프로젝트로 가져오면 됩니다.
그리고 Objective-C 코드 또는 클래스로 속성/메소드에 액세스하려면 이 옵션을 사용합니다.
대부분의 경우 Swift 클래스의 Objective-C 기본 클래스를 하위 분류할 때 발생합니다.
Swift 클래스 또는 프로토콜은 Objective-C에서 액세스할 수 있고 사용할 수 있으려면 @objc 특성으로 표시되어야 합니다.이 속성은 컴파일러에게 이 Swift 코드 조각이 Objective-C에서 액세스할 수 있음을 알려줍니다.Swift 클래스가 Objective-C 클래스의 하위 클래스인 경우 컴파일러는 자동으로 @objc 속성을 추가합니다.
여기 사과 문서에는 다음과 같은 내용이 나와 있습니다.@objc
.
업데이트된 링크:
애플이 링크를 업데이트한 것 같습니다.
@objc는 클래스 속성이므로 다음을 사용합니다.
@objc public class MyClass
클래스의 메서드를 Objective C 클래스에 노출하므로 클래스에 공용 함수가 포함된 경우에만 사용할 수 있습니다.
, 이 늦은답, 나이것러.@objc
Swift 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의 기능을 사용하려면:
- 스위프트의 클래스는 에서 확장되어야 합니다.
- 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:];
언급URL : https://stackoverflow.com/questions/30795117/when-to-use-objc-in-swift
'programing' 카테고리의 다른 글
PIL을 사용하여 이미지 파일 크기를 줄이는 방법 (0) | 2023.08.24 |
---|---|
주피터 노트북을 신뢰할 수 없습니다. (0) | 2023.08.24 |
웹에서 파일 업로드 진행률 표시줄을 구현하는 방법은 무엇입니까? (0) | 2023.08.24 |
VBA를 사용하여 셀에 공식을 입력하는 방법은 무엇입니까? (0) | 2023.08.24 |
도커 파일에서 이미지 이름을 설정하는 방법은 무엇입니까? (0) | 2023.08.24 |