program tip

Swift에서 Objective-C 코드를 어떻게 호출합니까?

radiobox 2020. 9. 28. 08:51
반응형

Swift에서 Objective-C 코드를 어떻게 호출합니까?


Swift에서 Objective-C 코드를 어떻게 호출합니까?

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


Swift에서 Objective-C 클래스 사용

** 사용하려는 기존 수업이있는 경우 2 단계를 수행 한 다음 5 단계 로 건너 뜁니다 . (어떤 경우 #import <Foundation/Foundation.h에는 이전 Objective-C 파일에 명시 적 파일 을 추가해야했습니다 .) **

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

.m클래스에 파일을 추가 하고 이름을 CustomObject.m.

2 단계 : 브리징 헤더 추가

.m파일을 추가 할 때 다음과 같은 메시지가 표시 될 수 있습니다.

여기에 이미지 설명 입력

예를 클릭하십시오 !

프롬프트가 표시되지 않거나 실수로 브리징 헤더를 삭제 한 경우 .h프로젝트에 파일을 추가 하고 이름을 <#YourProjectName#>-Bridging-Header.h.

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

여기에 이미지 설명 입력

노트

프로젝트를 $(SRCROOT)이동하거나 원격 저장소를 사용하여 다른 사람과 함께 작업하는 경우에도 계속 작동 하도록 매크로를 사용하여 프로젝트를 연결하는 것이 가장 좋습니다 . $(SRCROOT).xcodeproj 파일이 포함 된 디렉토리로 생각할 수 있습니다. 다음과 같이 보일 수 있습니다.

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

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

다른 .h파일을 추가 하고 이름을 CustomObject.h.

4 단계 : Objective-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 = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
println(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()

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

Objective-C에서 Swift 클래스 사용

1 단계 : 새 Swift 클래스 생성

.swift프로젝트에 파일을 추가 하고 이름을 MySwiftObject.swift.

에서 MySwiftObject.swift:

import Foundation

class MySwiftObject : NSObject {

    var someProperty: AnyObject = "Some Initializer Val"

    init() {}

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

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);

// original
NSString * retString = [myOb someFunction:@"Arg"];
// xcode10 expands the external arg here
NSString * retString = [myOb someFunctionWithSomeArg:@"Arg"];|

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

노트 :

1. CodeCompletion이 내가 원하는만큼 정확하게 작동하지 않았습니다. 내 시스템에서 "cmd + r"로 빠른 빌드를 실행하는 것은 Swift가 Objective-C 코드 중 일부를 찾는 데 도움이되었으며 그 반대의 경우도 마찬가지입니다.

2..swift 이전 프로젝트에 파일을 추가하고 오류가 발생하면 Xcode를dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib 완전히 다시 시작해보십시오 .

3. 원래 @objc접두사 를 사용하여 Objective-C에서 순수한 Swift 클래스를 사용할 수 있었지만 Swift 2.0 이후에는 더 이상 가능하지 않습니다. 원래 설명은 편집 내역을 참조하십시오. 이 기능이 향후 Swift 버전에서 다시 활성화되면 그에 따라 답변이 업데이트됩니다.


Cocoa 및 Objective-C와 함께 Swift 사용에 대한 Apple의 가이드를 참조하십시오 . 이 가이드는 Swift의 Objective-C 및 C 코드를 사용하는 방법과 그 반대의 경우를 다루며 프로젝트를 변환하거나 기존 프로젝트에서 Objective-C / C 및 Swift 부품을 혼합 및 일치시키는 방법에 대한 권장 사항을 제공합니다.

컴파일러는 C 함수 및 Objective-C 메서드를 호출하기위한 Swift 구문을 자동으로 생성합니다. 문서에서 볼 수 있듯이이 Objective-C :

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

이 Swift 코드로 바뀝니다.

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

Xcode는 또한이 번역을 즉석에서 수행합니다. Swift 파일을 편집하는 동안 Open Quickly를 사용하고 Objective-C 클래스 이름을 입력하면 Swift-ified 버전의 클래스 헤더로 이동합니다. (또한 Swift 파일의 API 기호를 cmd- 클릭하여 얻을 수 있습니다.) iOS 8OS X v10.10 (Yosemite) 개발자 라이브러리의 모든 API 참조 문서는 Objective-C와 Swift 모두에서 볼 수 있습니다. 양식 (예 :) UIView.


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

  1. File-> New-> New File-> Objective-C File을 선택 하여 Swift 프로젝트Objective-C 파일을 추가합니다 . 저장시 Xcode는 브리징 헤더를 추가 할 것인지 묻습니다 . ' '를 선택하십시오 . (출처 : derrrick.com )GIF : 프로젝트에 빈 파일 추가 및 브리징 헤더 생성

간단한 단계 :

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

  2. 선택적으로 추가 한 Objective-C 파일 (위의 GIF 이미지에서 "anything"으로 명명 됨)을 삭제합니다. 더 이상 필요하지 않습니다.

  3. 브리징 헤더 파일을 엽니 다. 파일 이름은 [YourProject] -Bridging-Header.h 형식 입니다. 여기에는 Xcode 제공 주석이 포함됩니다. 타사 프레임 워크와 같이 포함하려는 Objective-C 파일에 대한 코드 줄을 추가합니다 . 예를 들어 Mixpanel을 프로젝트에 추가하려면 브리징 헤더 파일에 다음 코드 줄을 추가해야합니다.

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

Mixpanel의 예 :

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 헤더를 넣어야합니다. 그런 다음 빌드 설정에서 참조해야합니다. 그 후 Objective-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)
  })

또한 Apple의 문서 Using Swift with Cocoa 및 Objective-C살펴보십시오 .


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

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

특히이 예제 는 Swift에서 Objective-C 및 C ++ 함수를 호출합니다 .

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

전체 예제로 프로젝트를 다운로드하십시오.


문서 에서 인용 :

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

import Foundation

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


여기에 추가하고 싶은 한 가지 더 :

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

그러나 이러한 모든 단계를 수행 한 후에도 Swift에서 Objective-C 클래스를 얻지 못합니다.

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

따라서 Swift에서 Objective-C 포드를 사용하는 경우 Swift로 import클래스 를 가져 오지 못하거나 클래스 를 가져 오지 못할 수 있습니다 .

당신이해야 할 간단한 일은 :

  1. <YOUR-PROJECT>-Bridging-Header파일로 이동 하고
  2. #import <ObjC_Framework>을 다음으로 바꿉니다.@import ObjC_Framework

예 : (팝 라이브러리)

바꾸다

#import <pop/POP.h>

@import pop;

작동하지 않을 clang import사용하십시오 #import.


스위프트에 목표 - C 라이브러리를 추가하려고 누구에 대한 그냥 참고 사항 : 당신은 추가해야합니다 -ObjC 에서 빌드 설정 -> 링크하기 -> 기타 링커 플래그 .


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

바로 아래에 ""Objective-C 생성 인터페이스 헤더 이름 "파일이 있습니다.

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

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

여기에 eEter 이미지 설명


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

"Swift 컴파일러-코드 생성"의 "Objective-C 브리징 헤더"


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

여기에 이미지 설명 입력swift에서 객관적인 C 코드를 호출하는 작은 샘플을 포함하는 프로젝트를 github에 추가했습니다.

Swift에서 ObjectiveC 클래스 호출


Xcode 10.1의 Swift 4.2.1 프로젝트에서 Objective-C 파일을 쉽게 추가 할 수 있습니다. Objective-C 파일을 Swift 프로젝트에 연결하려면 아래 단계를 따르십시오.

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

File> New> Project> objc.

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

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

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

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

여기에 이미지 설명 입력

Step_04 : 옵션 선택 :

Create Bridging Header.

Step_05 : 해당 파일이 다음 이름으로 생성됩니다.

Objc-Bridging-Header.h.

여기에 이미지 설명 입력

Step_06 : 이제 브리지 헤더에 브리지 파일 경로를 설정해야합니다. 프로젝트 네비게이터에서 이름이있는 프로젝트를 클릭 objc하고 다음을 선택합니다.

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

Step_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)
}

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


Swift에서 Objective-C 클래스 사용

  1. Objective-C 헤더 .h및 구현 .m
    추가 프로젝트에 <FileName>.m<FileName>.h파일 추가

  2. 브리징 헤더
    추가 .m 파일을 추가 할 때 프롬프트에서 "예"를 클릭하십시오.Would you like to configure an Objective-C bridging header

  3. Bridging-Header
    In YourProject-Bridging-Header.h클래스 추가#import "<FileName>.h"

Objective-C에서 Swift 클래스 사용

  1. 프로젝트로 <FileName>.swift확장 되는 파일 추가NSObject
  2. ObjC 클래스로 Swift 파일 가져 오기 Objective-C 파일에
    추가#import "<#YourProjectName#>-Swift.h"
  3. 공개 Swift 코드 표시 [@objc 및 @objcMembers]

여기에서 더 많은 것을 읽으 십시오


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

관련 부분은 다음과 같습니다.

Objective-C 파일 집합을 동일한 앱 대상 내의 Swift 코드로 가져 오려면 Objective-C 브리징 헤더 파일을 사용하여 해당 파일을 Swift에 노출합니다 . Xcode는 Swift 파일을 기존 Objective-C 앱에 추가하거나 Objective-C 파일을 기존 Swift 앱에 추가 할 때이 헤더를 생성하도록 제안합니다.

수락하면 Xcode는 생성 한 파일과 함께 브리징 헤더 파일을 생성하고 제품 모듈 이름 뒤에 "-Bridging-Header.h"를 사용하여 이름을 지정합니다. 또는 파일> 새로 만들기> 파일> [운영 체제]> 소스> 헤더 파일을 선택하여 직접 브리징 헤더를 생성 할 수 있습니다.

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

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

브리징 헤더에 나열된 모든 공개 Objective-C 헤더는 Swift에 표시됩니다.


Objective-C를 사용하는 양방향 접근 방식 Objective-C

1

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

2

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

이제 가셔서 감사합니다


Logans 대답 은 최근에 Swift 5컴파일러 오류가 발생하는 것을 제외하고는 잘 작동합니다 . 다음은 Swift 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
    }
}

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

반응형