objective-c - 호출 - 스위프트 헤더파일




Swift에서 Objective-C 코드를 호출하는 방법 (10)

Apple의 새로운 Swift 언어에서는 Objective-C 코드를 어떻게 호출합니까?

Apple은 하나의 응용 프로그램에 공존 할 수 있다고 언급했지만 이것이 Swift에서 새로운 수업을 작성하는 동안 Objective-C로 만든 이전 수업을 기술적으로 재사용 할 수 있다는 것을 의미합니까?

추론

Objective-C는 플랫폼 독립적 인 언어이지만 Swift는 플랫폼에 종속적입니다. 따라서 Swift에서 비 플랫폼 종속 코드 (비즈니스 로직 라이브러리)를 작성하는 것은 현명하지 않습니다. 그러나 플랫폼 종속 코드 (예 : 인터페이스 관련)를 작성하는 것은 완벽 할 것입니다. 그러나 그것은 좋은 생각이 될 것이라고 말할 수는 없지만 그것은 분명히 흥미입니다.


Swift에서 Objective-C 클래스 사용하기

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

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 단계 : 브리징 헤더에 클래스 추가

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 파일을 프로젝트에 추가하고 이름을 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 클래스로 가져 오기

SomeRandomClass.m :

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

파일 : <#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 someFunction:@"Arg"];
NSLog(@"RetString: %@", retString);

노트 :

1. CodeCompletion은 내가 원하는만큼 정확하게 행동하지 않았습니다. 내 시스템에서 "cmd + r"로 빠른 빌드를 실행하면 Swift가 Objective-C 코드를 찾는데 도움이되는 것처럼 보였습니다.

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

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


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

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

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

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

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

당신이해야 할 간단한 일은 다음과 같습니다.

  1. <YOUR-PROJECT>-Bridging-Header 파일로 이동하고
  2. #import <ObjC_Framework> 문을 @import ObjC_Framework

예 : (팝 라이브러리)

바꾸다

#import <pop/POP.h>

@import pop;

#import 가 작동하지 않으면 clang import 사용하십시오.


Objective-C 라이브러리를 Swift에 추가하려는 사람을위한 메모 : 빌드 설정 -> 연결 -> 기타 링커 플래그-ObjC 를 추가해야합니다.


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

  1. File -> New -> New File -> Objective-C File을 선택 하여 Objective-C 파일을 Swift 프로젝트추가하십시오 . 저장시 Xcode는 브리징 헤더를 추가할지 묻습니다 . ' '를 선택하십시오. Gif : 빈 파일을 프로젝트에 추가하고 브리지 헤더 생성 http://www.derrrick.com//1-empty-file.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의 가이드 는 빨리 읽을 수 있습니다. 또는 불완전한 요약을 보려면이 대답을보십시오.

믹스 패널의 예 :

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

그게 다야!

참고 : 프로젝트에서 브리징 헤더 파일을 제거하는 경우 Build Settings로 이동하여 "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의 코코아 및 Objective-C와 함께 Swift 사용 문서도 살펴보십시오.


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

import Foundation

이 가져 오기를 사용하면 NSDate, NSURL, NSMutableData 및 모든 메소드, 속성 및 범주를 비롯한 모든 Foundation API가 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 파일을 편집 할 때 Objective-C 클래스 이름을 입력하면 Open을 빠르게 사용할 수 있습니다. 그러면 클래스 헤더의 Swift-ified 버전으로 이동합니다. (Swift 파일에서 cmd를 클릭하여 API 심볼을 볼 수도 있습니다.) 그리고 iOS 8OS X v10.10 (Yosemite) 개발자 라이브러리의 모든 API 참조 문서는 Objective-C 및 Swift 모두에서 볼 수 있습니다 양식 (예 : UIView ).


문서 에서 인용 :

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

import Foundation

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


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

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


Xcode 9.4의 Swift 4.2 프로젝트에서 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 : 이제 브리지 헤더에 Bridge 파일 경로를 설정해야합니다. Project Navigator에서 이름이 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