programing

Swift 코드를 Objective-C로 가져오려면 어떻게 해야 합니까?

showcode 2023. 5. 20. 11:00
반응형

Swift 코드를 Objective-C로 가져오려면 어떻게 해야 합니까?

저는 스위프트에서 도서관을 작성했는데 Objective-C로 작성된 현재 프로젝트로 가져올 수 없었습니다.

수입할 수 있는 방법이 있습니까?

#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found

은 가올필있다니를 수입해야 .ProductName-Swift.h제품 이름입니다. 다른 답변에서는 클래스 이름을 잘못 사용합니다.

"Objective-C"라는 인터페이스를 정의하는 자동 생성 헤더입니다.@objc또는 에서 상속받습니다.NSObject.

고려 사항:

  • 공백이 " " " " " " " " " ")로 합니다.My Project 되다My_Project-Swift.h)

  • 대상이 프레임워크인 경우 다음을(를) 가져와야 합니다.<ProductName/ProductName-Swift.h>

  • Swift 파일이 대상의 구성원인지 확인합니다.

다음은 수행할 작업입니다.

  1. 목표-C에서 새 프로젝트 생성

  2. 새기 .swift

    • 팝업 창이 나타나고 "Objective-C Bridging Header를 구성하시겠습니까?"라고 묻습니다.
    • 예를 선택합니다.
  3. Xcode Project 파일을 클릭합니다.

  4. 빌드 설정 클릭

  5. 검색 줄을 찾아 정의 모듈을 검색합니다.

  6. 값을 로 변경합니다.

  7. 제품 모듈 이름을 검색합니다.

  8. 값을 프로젝트 이름으로 변경합니다.

  9. delegate에 대에다추다가니를 추가합니다#import "YourProjectName-Swift.h"


참고: Swift 파일을 사용하려면 다음 행을 가져와야 합니다.

#import "YourProjectName-Swift.h"

Apple 웹 사이트의 지침:

동일한 프레임워크에서 목표-C로 Swift 코드를 가져오려면 다음과 같이 하십시오.

빌드 설정패키징에서 해당 프레임워크 대상에 대한 모듈 정의 설정이 예로 설정되어 있는지 확인합니다.다음 구문을 사용하고 적절한 이름으로 대체하여 해당 프레임워크 대상에서 해당 프레임워크 대상 내의 Objective-C.m 파일로 Swift 코드를 가져옵니다.

#import "ProductName-Swift.h"

개정:

ProductName-Swift만 가져올 수 있습니다.h"를 .m 파일에 저장합니다.

대상의 Swift 파일은 이 가져오기 문이 포함된 목표-C.m 파일에 표시됩니다.

주기적인 참조를 피하기 위해 Swift를 Objective-C 헤더 파일로 가져오지 마십시오.대신 Swift 클래스를 Objective-C 헤더에서 사용하도록 포워드 선언할 수 있습니다.목표-C에서는 Swift 클래스를 하위 클래스로 분류할 수 없습니다.

여기에 이미지 설명 입력

Cocoapods를 사용하고 있고 ObjC 프로젝트에서 Swift 포드를 사용하려고 하면 다음 작업을 간단히 수행할 수 있습니다.

@import <FrameworkName>;

여기에 이미지 설명 입력

프로젝트 파일의 빌드 설정으로 이동하여 "Object-C 생성 인터페이스 헤더 이름"을 검색합니다.해당 속성의 값은 포함해야 하는 이름입니다.

"제품 모듈 이름" 속성(위 속성이 기본적으로 의존하는 속성)이 테스트/디버깅/릴리스/등을 위해 컴파일하는지 여부에 따라 다르다면 사용자 지정 이름을 설정하여 이 속성을 해당 변형과 독립적으로 만드십시오.

가져오기Swift줄을 지어 안으로 들어가다Objective-c그렇지 않으면 이 오류를 발생시킬 수 있습니다.import적절히.

참고: Swift 파일을 외부로 가져올 필요는 없으며, Swift 파일을 관리하는 하나의 파일만 가져오면 됩니다.

Objective-C 프로젝트에서 Swift 파일을 생성/복사했을 때.자동으로 브리징 헤더를 만들었을 겁니다

인확을 합니다.Objective-C Generated Interface Header NameTargets -> Build Settings.

여기에 이미지 설명 입력

위의 내용을 바탕으로 수입하겠습니다.KJExpandable-Swift.h현 상황에서는.

은 당의것이 될 입니다.TargetName-Swift.h서, 디에어TargetName프로젝트 이름이나 추가하여 실행 중인 다른 대상에 따라 다릅니다.

의 목표는 와 같습니다.KJExpandable그래서 그것은KJExpandable-Swift.h
여기에 이미지 설명 입력

첫 번째 단계:-

프로젝트 대상 선택 -> 빌드 설정 -> 검색('정의') -> 모듈 업데이트 값 정의 No to Yes

"모듈 정의": .

"Always Embed Swift Standard Libraries" : 예

"Objective-C 호환성 헤더 설치" : 예.

여기에 이미지 설명 입력

두 번째 단계:-

아래와 같이 목표 C.h" 파일에 Swift 파일 클래스를 추가합니다.

#import <UIKit/UIKit.h>

@class TestViewController(Swift File);

@interface TestViewController(Objective C File) : UIViewController

@end

Objective C.m" 파일의 'ProjectName(사용자 프로젝트 이름)-Swift.h' 가져오기

//TestViewController.m 
#import "TestViewController.h"

/*import ProjectName-Swift.h file to access Swift file here*/

#import "ProjectName-Swift.h"

Swift 4에서 프로젝트를 만든 다음 Objective-C 파일을 추가한 경우 다음과 같이 수행합니다.

@objcMembers
public class MyModel: NSObject {
    var someFlag = false         
    func doSomething() {         
        print("doing something")
    }
}

참조: https://useyourloaf.com/blog/objc-warnings-upgrading-to-swift-4/

Swift 코드를 동일한 프레임워크 내의 Objective-C 파일로 가져올 경우 한 가지 주의할 점이 있습니다.이 작업은 프레임워크 이름과 대괄호를 지정하여 수행해야 합니다.

#import <MyFramework/MyFramework-Swift.h>

MyFramework Module Name" 설정(" Module Name" 빌드 설정입니다.PRODUCT_NAME = MyFramework).

단순추 추가하기#import "MyFramework-Swift.h"작동하지 않습니다.directory ( products 디렉토리 를 확인하는 경우#import를 하나 했습니다). 됩니다.MyFramework-Swift.h에 시대에Headers디렉토리입니다.

대시와 밑줄은 혼동될 수 있으며 프로젝트 이름과 대상 이름이 SWIFT_MODULE_NAME과 동일하지 않을 수 있으므로 주의하십시오.

대시 및 밑줄

동일한 프로젝트의 Swift 및 Objective C에 대한 사전 릴리스 노트를 확인하십시오.

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html #//apple_ref/doc/uid/TP40014216-CH10-XID_75

다음을 가져올 것입니다.

#import "SCLAlertView-Swift.h"

빌드하려는 대상의 빌드 설정에서 "Objective-C 생성 인터페이스 헤더 이름"을 검색합니다(예:MyApp-Swift.h이( ).#import "MyApp-Swift.h"소스 파일에서 Swift API에 액세스할 수 있습니다.

은 " " " 입니다." 입니다.$(SWIFT_MODULE_NAME)-Swift.hObjective-C Generated Interface Header Name 설정의 값 필드를 두 번 클릭하면 볼 수 있습니다.

이름에 My-App에서), 그다에음에$(SWIFT_MODULE_NAME)모든 대시가 밑줄로 대체됩니다.그래서 당신은 추가해야 할 것입니다.#import "My_App-Swift.h".

Swift 파일을 Objective-C 클래스에 사용하려면 Xcode 8부터 다음 단계를 수행할 수 있습니다.

목표-C에서 프로젝트를 생성한 경우:

  1. 새 Swift 파일 만들기
  2. Xcode는 Bridge-Header 파일을 자동으로 요청합니다.
  3. 생성
  4. "ProjectName-Swift"를 가져옵니다.h"는 Object-C 컨트롤러(인터페이스가 아닌 구현 시 가져오기)에 있습니다(프로젝트 이름 사이에 공백이 있으면 "Project_Name-Swift"를 사용하십시오).h")
  5. Swift의 Objective-C 클래스에 액세스할 수 있습니다.

컴파일하면 다음과 같은 링커 오류가 발생합니다. 아키텍처 x86_64 또는 armv7의 이전 파일(2.0)보다 새로운 버전의 Swift 언어(3.0)로 컴파일됩니다.

한 번 더 변경할 수 있습니다.

  1. Xcode -> 프로젝트 -> 대상 -> 빌드 설정 -> 레거시 스위프트 언어 버전 사용 -> 예

빌드 및 실행.

#import <TargetName-Swift.h>

키보드 #import <에서 입력하면 볼 수 있으며, 자동으로 Xcode가 당신에게 조언을 해줄 것입니다.

구문에 대한 몇 가지 팁, Xcode에 대한 모든 것이 언급되었습니다.

  1. "public"으로 표시되어 있더라도 'pure' 함수, 클래스만 가져올 수 없으므로 다음과 같이 하십시오.

    public func f1({print("f1"); }

어떤 식으로든 호출되지 않습니다.

  1. 클래스를 작성하는 경우 NSObject에서 상속을 추가합니다. 다른 클래스는 사용할 수 없습니다.

  2. 다음과 같이 NSObject에서 상속되는 경우:

    클래스 사용률: NSObject{

    static funcaa()->String{ 반환 "AAA" }

    @objc static funcbb()->String{ 반환 "BBB" }

    @objc 개인 정적 함수 ccc()->String{ 반환 "CCC" }

    }

OBJC에서:

aaa() 호출되지 않음: "선택기 'aaa'에 대해 알려진 클래스 메서드가 없습니다."

BBBOK

ccc() 호출되지 않음: "선택기 'aaa'에 대해 알려진 클래스 메서드가 없습니다."

프로젝트 내에서 .PCH 파일을 찾습니다.추가합니다.#import "YourProjectName-Swift.h"클래스 헤더를 가져옵니다.따라서 특정 파일로 가져올 필요가 없습니다.

#ifndef __IPHONE_3_0
#warning "This project uses features only available in iPhone SDK 3.0 and later."
#endif


#ifdef __OBJC__
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    #import "YourProjectName-Swift.h"
#endif

언급URL : https://stackoverflow.com/questions/24102104/how-can-i-import-swift-code-to-objective-c

반응형