programing

스위프트에서 오브젝티브-C 코드를 어떻게 부르나요?

elecom 2023. 5. 28. 19:57
반응형

스위프트에서 오브젝티브-C 코드를 어떻게 부르나요?

스위프트에서 오브젝티브-C 코드를 어떻게 부르나요?

Apple은 하나의 애플리케이션에서 공존할 수 있다고 언급했지만, 이것은 Swift에서 새로운 클래스를 구축하면서 Objective-C에서 만들어진 이전 클래스를 기술적으로 재사용할 수 있다는 것을 의미합니까?

Swift에서 Objective-C

사용할 기존 클래스가 있는 경우 2단계를 수행한 다음 5단계로 건너뜁니다. (경우에 따라 명시적으로 추가해야 함)#import <Foundation/Foundation.h이전 Objective-C 파일로 이동합니다.)

1단계: 목표-C 구현 추가 -- .m

추가.m반에 파일을 작성하고 이름을 지정합니다.CustomObject.m.

2단계: 브리징 헤더 추가

의 가할때를 할 때.m다음과 같은 메시지가 표시될 수 있습니다.

"Objective-C 브리징 헤더를 구성할지 여부"를 묻는 Xcode의 macOS 시트 스타일 대화 상자

예를 클릭합니다!

헤더를 "" "" "" "" "" "" "" ""를 합니다..h합니다.<#YourProjectName#>-Bridging-Header.h.

상황에 따라, 특히 Objective-C 프레임워크로 작업할 때 Objective-C 클래스를 명시적으로 추가하지 않고 Xcode가 링커를 찾을 수 없습니다.이경다항만다듭니목을을 ..h위에서 언급한 대로 파일 이름을 지정한 다음 다음과 같이 대상의 프로젝트 설정에서 경로를 연결해야 합니다.

위 단락을 보여주는 애니메이션

참고:

다음을 사용하여 프로젝트를 연결하는 것이 가장 좋습니다.$(SRCROOT)매크로를 사용하여 프로젝트를 이동하거나 원격 리포지토리를 사용하여 다른 사용자와 함께 작업해도 프로젝트가 계속 작동합니다. $(SRCROOT)파일이 있는 할 수 .xcodeproj 파일이 들어 있는 디렉터리라고 생각할 수 있습니다.다음과 같이 표시될 수 있습니다.

$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h

3단계: 목표 C 헤더 추가 -- .h

다항목추를 합니다..h서류철을 작성하고 이름을 대라.CustomObject.h.

4단계: 목표 C 클래스 구축

CustomObject.h

#import <Foundation/Foundation.h>

@interface CustomObject : NSObject

@property (strong, nonatomic) id someProperty;

- (void) someMethod;

@end

CustomObject.m

#import "CustomObject.h"

@implementation CustomObject 

- (void) someMethod {
    NSLog(@"SomeMethod Ran");
}

@end

5단계: Bridging-Header에 클래스 추가

YourProject-Bridging-Header.h:

#import "CustomObject.h"

6단계: 객체 사용

SomeSwiftFile.swift:

var instanceOfCustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
print(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()

명시적으로 가져올 필요가 없습니다. 이것이 브리징 헤더의 목적입니다.

목표-C에서 Swift 클래스 사용

1단계: 새 Swift 클래스 만들기

추가.swift프로젝트 파일 및 이름 지정MySwiftObject.swift.

MySwiftObject.swift:

import Foundation

@objc(MySwiftObject)
class MySwiftObject : NSObject {

    @objc
    var someProperty: AnyObject = "Some Initializer Val" as NSString

    init() {}

    @objc
    func someFunction(someArg: Any) -> NSString {
        return "You sent me \(someArg)"
    }
}

2단계: ObjC 클래스로 Swift 파일 가져오기

SomeRandomClass.m:

#import "<#YourProjectName#>-Swift.h"

파일:<#YourProjectName#>-Swift.h볼 수 없는 경우에도 이미 프로젝트에 자동으로 생성되어 있어야 합니다.

3단계: 클래스 사용

MySwiftObject * myOb = [MySwiftObject new];
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
myOb.someProperty = @"Hello World";
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);

NSString * retString = [myOb someFunctionWithSomeArg:@"Arg"];

NSLog(@"RetString: %@", retString);

주의:

  1. Code Completion이 예상대로 작동하지 않으면 빠른 빌드를 실행하여 Xcode가 Swift 컨텍스트에서 Objective-C 코드의 일부를 찾을 수 있도록 하고 그 반대도 마찬가지입니다.

  2. 을 하면,.swift합니다.dyld: Library not loaded: @rpath/libswift_stdlib_core.dylibXcode를 완전히 다시 시작해 보십시오.

  3. 원래 순수 스위프트 클래스를 사용할 수 있었지만(의 후손이 아님)NSObject을됩니다.@objc접두사. 더 이상 사용할 수 없습니다.볼 수가 이제, 목-C에보스이객위다합체니다같야클여래스에 .NSObjectProtocol(이를 수행하는 일반적인 방법은 다음에서 상속하는 것입니다.NSObject) 또는 다음이 될 것enum가 있는@objc떤있 정 형 값 가 니 습 고 다 지 을 원 수 의 와 같은 정수형의 원시 값을 사용합니다.Int이러한 제한 없이 사용하는 Swift 1.x 코드의 예에 대한 편집 기록을 볼 수 있습니다.

코코아목표-C와 함께 스위프트 사용에 대한 Apple의 가이드를 참조하십시오.본 가이드에서는 Swift의 Objective-C 및 C 코드를 사용하는 방법에 대해 설명하고 프로젝트를 변환하거나 기존 프로젝트에서 Objective-C/C 및 Swift 부품을 혼합 및 일치시키는 방법에 대한 권장 사항을 제공합니다.

컴파일러는 C 함수와 Objective-C 메서드를 호출하기 위한 Swift 구문을 자동으로 생성합니다.설명서에 나와 있는 것처럼 이 목표 C:

UITableView *myTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];

다음과 같은 Swift 코드로 변환됩니다.

let myTableView: UITableView = UITableView(frame: CGRectZero, style: .Grouped)

Xcode는 이 변환도 즉시 수행합니다. Swift 파일을 편집하는 동안 Open Quick을 사용하고 Objective-C 클래스 이름을 입력하면 클래스 헤더의 Swift화 버전으로 이동합니다. (Swift 파일의 API 기호를 cmd-클릭하여 이를 얻을 수도 있습니다.)iOS 8OS X v10.10(Yosemite) 개발자 라이브러리의 모든 API 참조 문서는 Objective-C 및 Swift 형식(예: )으로 볼 수 있습니다.

다음은 Swift 프로젝트에서 목표-C 코드(이 경우 타사에서 제공하는 프레임워크)를 사용하기 위한 단계별 지침입니다.

  1. 파일 ->새로 만들기 ->새로 만들기 ->목표-C 파일을 선택하여 Swift 프로젝트에 목표-C 파일을 추가합니다.저장 시 Xcode에서 브리징 헤더를 추가할지 여부를 묻습니다.예'를 선택합니다.Gif: 프로젝트에 빈 파일 추가 및 브리징 헤더 생성
    (출처: derrrick.com )

간단한 단계:

  1. 프롬프트가 나타나고 확인...을 클릭합니다.표시되지 않으면 다음과 같이 수동으로 생성합니다.iOS 소스에서 하나의 헤더 파일을 만들고 ProjectName-Bridging-Header라는 이름을 지정합니다(예:Test-Bridging-Header)를 선택한 다음 Swift 컴파일러 코드의 빌드 설정으로 이동합니다. -> Objective-C 브리지 이름 추가.(시험/시험-브리지-헤더.h).네, 됐습니다.

  2. 또는 추가한 목표-C 파일(위의 GIF 이미지에서 "임의의"로 명명됨)을 삭제합니다.더 이상 필요 없습니다.

  3. 브리징 헤더 파일을 엽니다. 파일 이름은 [YourProject]-Bridging-Header.h 형식입니다.여기에는 X 코드로 제공된 설명이 포함되어 있습니다.포함할 목표-C 파일의 코드 줄(예: 타사 프레임워크)을 추가합니다.예를 들어 프로젝트에 Mixpanel을 추가하려면 브리징 헤더 파일에 다음 코드 줄을 추가해야 합니다.

    #import "믹스패널.h"
  4. 이제 모든 Swift 파일에서 기존 Objective-C 코드, Swift 구문(이 예의 경우 Mixpanel SDK 메서드 등을 호출할 수 있음)을 사용할 수 있습니다.Xcode가 Objective-C를 Swift로 변환하는 방법을 숙지해야 합니다.Apple의 가이드는 빠르게 읽을 수 있습니다.또는 불완전한 요약을 보려면 이 답변을 참조하십시오.

혼합 패널의 예:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    Mixpanel.sharedInstanceWithToken("your-token")
    return true
}

바로 그거야!

참고: 프로젝트에서 브리징 헤더 파일을 제거할 경우 빌드 설정으로 이동하여 "Swift Compiler - Code Generation"에서 "Objective-C Bridging Header" 값을 제거해야 합니다.

당신은 Swift & Cocoapods의 멋진 게시물을 읽을 수 있습니다.기본적으로, 우리는 브리징 헤더 파일을 만들고 모든 Objective-C 헤더를 거기에 배치해야 합니다.그런 다음 빌드 설정에서 참조해야 합니다.그 후에 우리는 목표-C 코드를 사용할 수 있습니다.

let manager = AFHTTPRequestOperationManager()
manager.GET(
  "http://example.com/resources.json",
  parameters: nil,
  success: { (operation: AFHTTPRequestOperation!,
              responseObject: AnyObject!) in
      println("JSON: " + responseObject.description)
  },
  failure: { (operation: AFHTTPRequestOperation!,
              error: NSError!) in
      println("Error: " + error.localizedDescription)
  })

또한 Swift를 코코아와 함께 사용하는 Apple의 문서와 Objective-C도 살펴보십시오.

C++, Objective-C, Swift 코드를 혼합하는 방법을 보여주는 간단한 Xcode 6 프로젝트를 작성했습니다.

https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console

특히, 이 예제에서는 SwiftObjective-CC++ 함수를 호출합니다.

핵심은 공유 헤더인 Project-Bridging-Header.h를 만들고 여기에 Objective-C 헤더를 넣는 것입니다.

완전한 예시로 프로젝트를 다운로드하십시오.

여기에 한 가지 더 추가하고 싶은 것이 있습니다.

저는 @Logan의 답변에 매우 감사드립니다.브리지 파일과 설정을 만드는 데 많은 도움이 됩니다.

하지만 이 모든 단계를 수행한 후에도 저는 여전히 스위프트에서 오브젝티브-C 수업을 받지 못하고 있습니다.

사용했습니다.cocoapods라이브러리를 사용하여 프로젝트에 통합했습니다. 것이 느어것이입니다.pod "pop".

Swift의 Objective-Codes를 가져오지 수 .import스위프트로 가는 수업.

간단한 작업은 다음과 같습니다.

  1. 에 가다<YOUR-PROJECT>-Bridging-Header
  2. 을 바기꾸로 합니다.#import <ObjC_Framework>@import ObjC_Framework

예: (팝 라이브러리)

교체하다

#import <pop/POP.h>

와 함께

@import pop;

사용하다clang import 때에#import작동하지 않습니다.

설명서에서 인용한 내용:

모듈로 액세스할 수 있는 Objective-C 프레임워크(또는 C 라이브러리)는 Swift로 직접 가져올 수 있습니다.여기에는 Foundation, UIkit 및 SpriteKit와 같은 모든 Objective-C 시스템 프레임워크와 시스템과 함께 제공되는 일반 C 라이브러리가 포함됩니다.예를 들어 Foundation을 가져오려면 이 가져오기 문을 작업 중인 Swift 파일의 맨 위에 추가하기만 하면 됩니다.

import Foundation

이 가져오기를 수행하면 NSDate, NSURL, NSMutableData 및 모든 메서드, 속성 및 범주를 포함한 모든 Foundation API를 Swift에서 직접 사용할 수 있습니다.

Swift에 Objective-C 라이브러리를 추가하려는 사용자를 위한 참고 사항: 빌드 설정 -> 링크 -> 기타 링커 플래그-ObjC를 추가해야 합니다.

Bridging 헤더를 작성한 후 Build Setting = > Search for "Objective-C Bridging Header"로 이동합니다.

바로 아래에 "Objective-C Generated Interface Header Name" 파일이 있습니다.

보기 컨트롤러에서 해당 파일을 가져옵니다.

예:제 경우: "Double-Swift.h"

여기에 이미지 설명 입력

오브젝티브-C와 스위프트 혼합

개략도:

동일한 대상

//Objective-C exposes API for Swift through <target_name>-Bridging-Header.h
.swift uses .h.m = Swift consumer, Objective-C producer = <target_name>-Bridging-Header.h

//Swift exposes API for Objective-C through <target_name>-Swift.h
.h.m uses .swift = Objective-C consumer, Swift producer = <target_name>-Swift.h

신속한 소비자, 목표-C 생산자

  1. 머리글 .h 구현 ».m- 파일(Objective-C) - 코코아 파일Objective-C)
    를 들어 를들면입니다.<MyFileName>.h그리고.<MyFileName>.m


  2. 을 볼 때.Would you like to configure an Objective-C bridging header클릭 - 예

    • <target_name>-Bridging-Header.h됩니다.
    • 빌드 설정 -> 목표-C 브리징 헤더(SWIFT_OBJC_BRIDGE_HEADER)
  3. 에 추가
    <target_name>-Bridging-Header.h#import "<MyFileName>.h"

그런 다음 사용할 수 있습니다.Swift Objective-C's MyFileName.h,MyFileName.m

P.S. Swift 프로젝트에 기존 Objective-C 파일을 추가해야 하는 경우 추가Bridging-Header.h하고 수입합니다.

목표-C 소비자, 스위프트 생산자

  1. 추가<MyFileName>.swift 확장 및장확NSObject

  2. 파일
    더하다#import "<target_name>-Swift.h" 파일 Objective-C 파일로 합니다.

  3. by 개 Swift 드출준기@objc 정보]

그 후에는 다음에서 사용할 수 있습니다.Objective-C Swift's <MyFileName>.swift

[<product_name>-Swift.h 파일을 찾을 수 없음]

Swift용 목표 C를 노출하는 데는 서로 다른 대상[.modulemap][umbrella.h]사용됩니다.그리고.Swift.h목표-C표-C에에 대한 Swift

[어휘]

New file 메뉴를 클릭하고 file select language Objective를 선택합니다.이때 일부 클래스 이름을 정의하는 데 사용되는 "Objective-C Bridging Header" 파일이 자동으로 생성됩니다.

"Swift Compiler - Code Generation" 아래의 "Objective-C Bridging Header"입니다.

  1. 새 파일 -> 소스 -> 헤더 파일에서 .h 파일 만들기
  2. 그런 다음 파일의 이름을 저장합니다. 여기 사람들은 프로젝트 이름을 사용하여 일반적으로 실수하지만 둘 다 다를 경우 일반적으로 동일한 프로젝트의 대상 이름이어야 합니다.
  3. 그런 다음 빌드 설정에서 Objective-C Bridging Header 플래그를 검색하고 새로 만든 브리징 파일의 주소를 입력하면 파일을 마우스 오른쪽 버튼으로 클릭하여 텍스트 영역에 파일을 드래그하면 주소가 채워집니다.
  4. #import Your_Objective-C_file.h 사용
  5. 빠른 파일에서는 ObjC 파일에 액세스할 수 있지만 빠른 언어로만 액세스할 수 있습니다.

Xcode 10.1의 Swift 4.2.1 프로젝트에서는 Objective-C 파일을 쉽게 추가할 수 있습니다.아래 단계에 따라 목표-C 파일을 Swift 프로젝트에 연결합니다.

Step_01: Swift 언어를 사용하여 새로운 Xcode 프로젝트를 만듭니다.

File>New>Project>objc.

Step_02: Swift 프로젝트에서 새 Objective-C 파일을 추가합니다.

File>New>File...>macOS>Objective-C File.

Step_03: 처음에 Swift 프로젝트에 새로운 Objective-C 파일을 추가하면 Xcode에서 다음과 같이 묻습니다.

Would you like to configure an Objective-C bridging header?

여기에 이미지 설명 입력

Step_04: 다음 옵션을 선택합니다.

Create Bridging Header.

Step_05: 다음과 같은 이름의 파일이 생성됩니다.

Objc-Bridging-Header.h.

여기에 이미지 설명 입력

Step_06: 이제 Bridge 헤더에 Bridge 파일 경로를 설정해야 합니다.에서 Project Navigator라는 합니다.objc그런 다음 다음을 선택합니다.

Build Settings>Objective-C Bridging Header>Objc-Bridging-Header.h.

앤 계단_07: 드그앤드Objc-Bridging-Header.h파일 경로를 생성할 수 있습니다.

여기에 이미지 설명 입력

Step_08을 .Objc-Bridging-Header.h파일을 저장하고 Swift 파일에 사용할 Objective-C 파일을 가져옵니다.

#import "SpecialObjcFile.m"

의 내용은 다음과 같습니다.SpecialObjcFile.m:

#import <Foundation/Foundation.h>

@interface Person: NSObject {
@public
    bool busy;
}
@property
    bool busy;
@end

Step_09: 이제 Swift 파일에서 Objective-C 클래스를 사용할 수 있습니다.

override func viewDidLoad() {
    super.viewDidLoad()
    let myObjcContent = Person()
    print(myObjcContent.busy)
}

여기에 이미지 설명 입력 여기에 이미지 설명 입력

Logans 응답이 최신을 제외하고 정상적으로 작동합니다.Swift 5컴파일러 오류가 발생합니다.여기 스위프트 5에서 작업하는 사람들을 위한 수정 사항이 있습니다.

스위프트 5

import Foundation

class MySwiftObject : NSObject {

    var someProperty: AnyObject = "Some Initializer Val" as AnyObject

    override init() {}

    func someFunction(someArg:AnyObject) -> String {
        let returnVal = "You sent me \(someArg)"
        return returnVal
    }
}

NSObject의 Swift 클래스 하위 클래스를 만드는 것은 의미가 있으며, 다음과 같은 Object-C 클래스에 표시되는 Swift 클래스를 사용하는 것을 선호합니다.

@objc(MySwiftClass)
@objcMembers class MySwiftClass {...}

Apple은 이 문서에 공식 가이드인 How-to-call-objective-c-code-from-swift를 제공했습니다.

다음은 관련 부분입니다.

동일한 앱 대상 내에서 일련의 Objective-C 파일을 Swift 코드로 가져오려면 Objective-C 브리징 헤더 파일을 사용하여 해당 파일을 Swift에 노출합니다.Xcode는 기존의 Objective-C 앱에 Swift 파일을 추가하거나 기존의 Swift 앱에 Objective-C 파일을 추가할 때 이 헤더를 만들 수 있습니다.

동의하면 Xcode는 작성 중인 파일과 함께 브리징 헤더 파일을 만들고 제품 모듈 이름 뒤에 "-Bridging-Header"를 사용하여 이름을 지정합니다.h." 또는 File > New > [운영체제] > Source > Header File을 선택하여 Bridging Header를 직접 생성할 수 있습니다.

브리지 헤더를 편집하여 목표-C 코드를 Swift 코드에 노출합니다.

  1. Objective-C Bridging 헤더에서 Swift에 노출할 모든 Objective-C 헤더를 가져옵니다.
  2. 빌드 설정의 Swift Compiler - Code Generation에서 Objective-C Bridging Header 빌드 설정에 브리지 헤더 파일에 대한 경로가 있는지 확인합니다.경로는 빌드 설정에서 Info.plist 경로를 지정하는 방법과 유사하게 프로젝트에 상대적이어야 합니다.대부분의 경우 이 설정을 수정할 필요가 없습니다.

Bridging 헤더에 나열된 공용 Objective-C 헤더는 Swift에서 볼 수 있습니다.

목표-c 목표-c를 사용하는 양방향 접근법

1

  1. Xcode Project에서 bridge-header.h 파일 생성
  2. bridge-Header 파일의 .h 파일 가져오기
  3. 빌드 설정에서 브리지 헤더의 경로를 설정합니다.
  4. 프로젝트 정리

2

  1. 프로젝트에서 목표-c 파일 생성(빌드 설정에서 자동으로 경로 설정)
  2. bridge-Header 파일의 .h 파일 가져오기

이제 시작합니다. 감사해요.

언급URL : https://stackoverflow.com/questions/24002369/how-do-i-call-objective-c-code-from-swift

반응형