programing

Objective-C 내에서 Swift 클래스를 사용할 수 없습니다.

mailnote 2023. 4. 16. 15:28
반응형

Objective-C 내에서 Swift 클래스를 사용할 수 없습니다.

는 통합하려고 .Swift내 앱에 코드가 있습니다.내 앱은 다음 위치에 있습니다.Objective-C는 ㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇ다를 넣었습니다.Swift수업. 여기에 설명된 건 다 했어요.하지만 문제는Xcode 창시하지 않았다-Swift.h★★★★★★★★★★★★★★★★★★★★★★★★그래서 제가 만들었는데, 사실 비어있어요.Swift에서는 ObjC 수업을 모두 사용할 수 있지만 그 반대로는 사용할 수 없습니다.는 는는 with my my my my 로 표시했다.@objc하지만 소용이 없어.제제어 떻떻? ???

같이 말합니다:"Swift Objective-C에 때 "Swift 코드를 "에 합니다.Xcode-generated에 "."를 합니다.[...] Swift는 Swift는 "-Swift는 "-Swift"를 추가합니다.아아아아아아아아아아아아아아아아아아아아아아

이 파일을 Import 할 때, 다음의 에러가 표시됩니다.

    //MainMenu.m

    #import "myProjectModule-Swift.h" //Error: 'myProjectModule-Swift.h' file not found

    @implementation MainMenu

FBManager.swift 파일은 다음과 같습니다.

@objc class FBManager: NSObject {

    var descr = "FBManager class"

    init() {
        super.init()
    }

    func desc(){
        println(descr)
    }

    func getSharedGameState() -> GameState{
        return GameState.sharedGameState() //OK! GameState is written in Objective-C and no error here
    }
}

4시간 정도 걸렸어요Swift 집에서는XcodeObjective-C My myproject-Swift.h작성되었지만, 의 파일은 정상적으로 작성되었습니다.XcodeSwift-classes저는 로 했습니다.XcodeObjc 기반 프로젝트, 그리고 마침내 정답을 찾았습니다!에게 도움이

Xcode Objc 기반 프로젝트를 위한 단계별 Swift 통합:

  1. 「」을 작성하다*.swift【X】【파인더】【파인더】【XX】【파견】
  2. 작성하다Objective-C bridging headerXcode(Xcode).
  3. Swift 클래스 구현:

    import Foundation
    
    // use @objc or @objcMembers annotation if necessary
    class Foo {
        //..
    }
    
  4. 빌드 설정을 열고 다음 파라미터를 확인합니다.

    • 모듈 정의: YES

      검색 줄에 매개 변수 이름 복사 & 붙여넣기

    • 제품 모듈 이름: myproject

      제품 모듈 이름에 특수 문자가 포함되어 있지 않은지 확인하십시오.

    • Objective-C 호환성 헤더 설치: YES

      를 추가하면*.swift은 빌드 됩니다.

    • Objective-C 생성 인터페이스 헤더: myproject-Swift.h

      이 헤더는 Xcode에 의해 자동으로 생성됩니다.

    • Objective-C 브리징 헤더: $(SRCROOT)/myproject-Bridging-Header.h
  5. *.m 파일에 Swift 인터페이스 헤더를 Import합니다.

    #import "myproject-Swift.h"
    

    오류 및 경고에 주의를 기울이지 마십시오.

  6. Xcode 프로젝트를 청소하고 재구축합니다.
  7. 이익!

헤더 파일을 직접 작성하지 마십시오.작성한 것을 삭제합니다.

에 Swift 태그가 붙어 있는지 합니다.@objc또는 (간접적으로 또는 간접적으로) 유래하는 클래스에서 상속하는NSObject.

프로젝트에 컴파일러 오류가 있는 경우 Xcode에서 파일이 생성되지 않습니다. 프로젝트를 깨끗하게 빌드하십시오.

Xcode가 작업을 수행하도록 허용하고 Swift 헤더를 수동으로 추가/작성하지 마십시오.Swift 클래스 ex 앞에 @objc를 추가합니다.

@objc class YourSwiftClassName: UIViewController

프로젝트 설정에서 아래 플래그를 검색하여 YES(프로젝트와 타겟 모두)로 변경합니다.

Defines Module : YES
Always Embed Swift Standard Libraries : YES
Install Objective-C Compatibility Header : YES

그런 다음 프로젝트를 청소하고 빌드한 후 (아마도 빌드 성공 후) objective-class.m 파일의 아래 헤더 파일을 Import합니다.

#import "YourProjectName-Swift.h" 

부웅!

, 프레임워크의 타겟을 가지고 계신 분에게도 도움이 될 것입니다.

자동 생성된 헤더 파일의 Import문이 앱 대상과 조금 다르게 보입니다.다른 답변에 언급된 다른 사항 외에 사용

#import <ProductName/ProductModuleName-Swift.h>

대신

#import "ProductModuleName-Swift.h"

프레임워크 타깃의 Mix & Match에 관한 Apple 문서에 따라 주세요.

상세: Xcode 8.1의 Swift 3 코드를 사용한 Objective-C 프로젝트

작업:

  1. objective-c 클래스에서 swift 열거 사용
  2. swift 클래스에서 objective-c enum을 사용합니다.

풀샘플

1. Swift 열거를 사용하는 Objective-C 클래스

ObjcClass.h

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSInteger, ObjcEnum) {
    ObjcEnumValue1,
    ObjcEnumValue2,
    ObjcEnumValue3
};

@interface ObjcClass : NSObject

+ (void) PrintEnumValues;

@end

ObjcClass.m

#import "ObjcClass.h"
#import "SwiftCode.h"

@implementation ObjcClass

+ (void) PrintEnumValues {
    [self PrintEnumValue:SwiftEnumValue1];
    [self PrintEnumValue:SwiftEnumValue2];
    [self PrintEnumValue:SwiftEnumValue3];
}

+ (void) PrintEnumValue:(SwiftEnum) value {
    switch (value) {
        case SwiftEnumValue1:
            NSLog(@"-- SwiftEnum: SwiftEnumValue1");
            break;
            
        case SwiftEnumValue2:
        case SwiftEnumValue3:
            NSLog(@"-- SwiftEnum: long value = %ld", (long)value);
            break;
    }
}

@end

Objective-C 코드에서 Swift 코드 탐지

제 샘플에서는 SwiftCode.h를 사용하여 Objective-C의 Swift 코드를 검출하고 있습니다.이 파일은 자동으로 생성되며(프로젝트에서 이 헤더 파일의 실제 복사본을 만들지 않았습니다), 이 파일의 이름만 설정할 수 있습니다.

여기에 이미지 설명 입력

여기에 이미지 설명 입력

컴파일러가 헤더 파일 Swift 코드를 찾을 수 없는 경우 프로젝트를 컴파일해 보십시오.

(2) Objective-C 열거를 사용하는 스위프트 클래스

import Foundation

@objc
enum SwiftEnum: Int {
    case Value1, Value2, Value3
}

@objc
class SwiftClass: NSObject {
    
    class func PrintEnumValues() {
        PrintEnumValue(.Value1)
        PrintEnumValue(.Value2)
        PrintEnumValue(.Value3)
    }
    
    class func PrintEnumValue(value: ObjcEnum) {
        switch value {
        case .Value1, .Value2:
            NSLog("-- ObjcEnum: int value = \(value.rawValue)")
            
        case .Value3:
            NSLog("-- ObjcEnum: Value3")
            break
        }
        
    }
}

Swift 코드에서 Objective-C 코드 검출

브리징 헤더 파일을 작성해야 합니다.Objective-C 프로젝트에서 Swift 파일을 추가하거나 swift 프로젝트에서 Objective-C 파일을 추가하는 경우 Xcode는 브리징 헤더를 생성하도록 제안합니다.

여기에 이미지 설명 입력

브리징 헤더 파일명은 여기서 변경할 수 있습니다.

여기에 이미지 설명 입력

Bridging-Header.h

#import "ObjcClass.h"

사용.

#import "SwiftCode.h"
...
[ObjcClass PrintEnumValues];
[SwiftClass PrintEnumValues];
[SwiftClass PrintEnumValue:ObjcEnumValue3];

결과

여기에 이미지 설명 입력


더 많은 샘플

위에서 설명한 목표-c Swift의 완전한 통합 단계.이제 다른 코드 예를 몇 가지 작성하겠습니다.

3. Objective-c 코드에서 Swift 클래스를 호출합니다.

스위프트 클래스

import Foundation

@objc
class SwiftClass:NSObject {
    
    private var _stringValue: String
    var stringValue: String {
        get {
            print("SwiftClass get stringValue")
            return _stringValue
        }
        set {
            print("SwiftClass set stringValue = \(newValue)")
            _stringValue = newValue
        }
    }
    
    init (stringValue: String) {
        print("SwiftClass init(String)")
        _stringValue = stringValue
    }
    
    func printValue() {
        print("SwiftClass printValue()")
        print("stringValue = \(_stringValue)")
    }
    
}

목표 C 코드(발신 코드)

SwiftClass *obj = [[SwiftClass alloc] initWithStringValue: @"Hello World!"];
[obj printValue];
NSString * str = obj.stringValue;
obj.stringValue = @"HeLLo wOrLd!!!";

결과

여기에 이미지 설명 입력

4. Swift 코드에서 Objective-c 클래스를 호출합니다.

Objective-C 클래스(ObjcClass.h)

#import <Foundation/Foundation.h>

@interface ObjcClass : NSObject
@property NSString* stringValue;
- (instancetype) initWithStringValue:(NSString*)stringValue;
- (void) printValue;
@end

ObjcClass.m

#import "ObjcClass.h"

@interface ObjcClass()

@property NSString* strValue;

@end

@implementation ObjcClass

- (instancetype) initWithStringValue:(NSString*)stringValue {
    NSLog(@"ObjcClass initWithStringValue");
    _strValue = stringValue;
    return self;
}

- (void) printValue {
    NSLog(@"ObjcClass printValue");
    NSLog(@"stringValue = %@", _strValue);
}

- (NSString*) stringValue {
    NSLog(@"ObjcClass get stringValue");
    return _strValue;
}

- (void) setStringValue:(NSString*)newValue {
    NSLog(@"ObjcClass set stringValue = %@", newValue);
    _strValue = newValue;
}

@end

스위프트 코드(발신 코드)

if let obj = ObjcClass(stringValue:  "Hello World!") {
    obj.printValue()
    let str = obj.stringValue;
    obj.stringValue = "HeLLo wOrLd!!!";
}

결과

여기에 이미지 설명 입력

5. Objective-c 코드에서 Swift 확장자를 사용합니다.

신속한 확장

extension UIView {
    static func swiftExtensionFunc() {
        NSLog("UIView swiftExtensionFunc")
    }
}

목표 C 코드(발신 코드)

[UIView swiftExtensionFunc];

6. 스위프트 코드에서 Objective-c 확장자를 사용한다.

목표 C 확장(UIView Extension).h)

#import <UIKit/UIKit.h>

@interface UIView (ObjcAdditions)
+ (void)objcExtensionFunc;
@end

UIView Extension.m

@implementation UIView (ObjcAdditions)
+ (void)objcExtensionFunc {
    NSLog(@"UIView objcExtensionFunc");
}
@end

스위프트 코드(발신 코드)

UIView.objcExtensionFunc()

프로젝트에서 모듈을 정의하고 모듈 이름을 지정했는지 확인하십시오. 다음는 Xcode를 .-Swift.h수입하다

프로젝트 설정에서 모듈 정의 및 모듈 이름을 설정할 수 있습니다.

같은 문제가 있었는데 모듈 이름의 특수 기호가 xcode로 대체되었습니다(내 경우 대시는 밑줄로 표시됨).프로젝트 설정에서 "모듈 이름"을 선택하여 프로젝트의 모듈 이름을 찾습니다. 후, 「 」를 사용합니다.ModuleName-Swift.h이치노

Xcode 6.3.2의 코드입니다.파생 데이터 your your로 한 후@objc컴파일 후 , , , , , , " " "Swift.h[Derived Data] (파생 데이터)입니다.재빠르다

가 내 Xcode로 을 바꾼 것이가 .my-Project-Swift.h로로 합니다.my_Project-Swift.hXcode를 않는다."." "-"클래스로 .Objective-C Import.

Swift 5의 경우:

  1. , 그럼 여기에다가 더해져요.@objc 및 로 설정합니다.
  2. public 및 로 설정합니다.
  3. .NSObject
  4. 프로젝트 구축
  5. 놓다를 #import "MyProject-Swift.h" fileObjective-C에

    @objc
    public class MyClass: NSObject {
    
        @objc
        public func myMethod() {
    
        }
    }
    

#import "my Project-Swift"만 포함하면 됩니다..m 또는 .h 파일의 h"

추신 "my Project-Swift"는 찾을 수 없습니다.파일 인스펙터의 h"는 숨겨져 있습니다.하지만 앱에서 자동으로 생성됩니다.

@sig 답변은 가장 좋은 답변 중 하나입니다만, 이전 프로젝트에서는 효과가 없었습니다(새로운 것이 아닙니다). 약간의 수정이 필요했습니다.많은 변형을 거쳐 레시피를 찾았습니다(XCode 7.2 사용).

  1. 제품 모듈명 : $(PRODUCT_NAME:c99 확장자)
  2. 모듈 정의: NO
  3. 포함된 콘텐츠에는 Swift가 포함되어 있습니다.
  4. Objective-C 호환성 헤더 설치 : YES
  5. Objective-C 브리징헤더 : ProjectName-Bridging-Header.h

마지막 포인트(5)가 중요했다.두 번째 섹션(Targets 필드)에만 두었습니다. Project 필드는 비워 두어야 합니다.여기에 이미지 설명 입력 그렇지 않으면 적절한 "프로젝트 스위프트"가 생성되지 않았습니다.h" 파일(swift 메서드는 포함되지 않았습니다).

두 가지 조건이 있습니다.

  • 목표 c 파일에서 swift 파일을 사용합니다.
  • swift 파일의 목적 c 파일을 사용합니다.

그러기 위해서는, 다음의 순서를 실행할 필요가 있습니다.

  • swift 파일을 objective-c 프로젝트에 추가하거나 그 반대로 추가합니다.
  • 헤더(.h) 파일을 만듭니다.
  • 「빌드 설정」으로 이동해, 다음의 검색 순서를 실행합니다.

    1. 이 텍스트 "brid"를 검색하여 헤더 파일의 경로를 설정합니다.
    2. "모듈 정의": 네.
    3. "Always Embed Swift Standard Libraries" : 네.
    4. "Install Objective-C Compatibility Header" : 예.

그런 다음 프로젝트를 정리하고 재구축하십시오.

목표 c 파일에서 swift 파일을 사용합니다.

그렇다면, 먼저 수업 전에 "@objc"라고 빠른 파일로 쓰세요.

그 후, 당신의 목표 c 파일에 이것을 쓰세요.

  #import "YourProjectName-Swift.h"

swift 파일의 목적 c 파일을 사용합니다.

그렇다면, 당신의 헤더 파일에 이것을 쓰세요.

  #import "YourObjective-c_FileName.h"

이것이 당신에게 도움이 되길 바랍니다.

내 경우 다음 단계를 제외하고:

  1. 제품 모듈명 : my project
  2. 모듈 정의 : YES
  3. 삽입 콘텐츠 포함 Swift : YES
  4. Objective-C 호환성 헤더 설치 : YES
  5. Objective-C 브리징 헤더 : $(SRCROOT)/소스/SwiftBridging.h

productName-Swift.h 파일을 작성하기 위해 클래스를 공개해야 했습니다.

import UIKit

   @objc public class TestSwift: NSObject {
       func sayHello() {
          print("Hi there!")
       }
   }

프로젝트에 swift 파일의 디렉토리를 추가할 수 없다는 것을 방금 알았습니다.먼저 디렉터리에 대한 그룹을 만든 다음 swift 파일을 추가해야 합니다.

나도 같은 문제가 있었는데 결국 그들이 같은 타겟에 붙어있지 않은 것 같았다.ObjC 클래스는 Target1 및 Target2에 연결되며 Swift 클래스는 Target1에만 연결되며 ObjC 클래스에는 표시되지 않습니다.

이게 도움이 됐으면 좋겠네요.

나의 문제는 xcode가 브리지 파일을 만든 후에 막혔는데, 여전히 헤더 파일 이름 MYPROJECTNAME-swift.h에 오류가 발생하였습니다.

1. 터미널에 체크인하여 자동으로 생성된 모든 스위프트브리지 파일을 검색합니다.

find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -

어떤 xcode가 생성되었는지 알 수 있습니다.

  1. 제 경우 프로젝트명에 공백이 있어서 xcode 치환하면 '_'입니다.

프로젝트에 새 Swift 파일을 추가할 때는 올바른 대상에 파일을 추가해야 합니다.사용하는 모든 swift 파일이 NSObject 클래스를 상속하고 빌드 설정 내에서 ALways_EMBED_SWIFT_STANDARD 옵션에서 @ObjCMembers Change to YES로 주석을 달았는지 확인하십시오.라이브러리DEFINE_MODULE 옵션 아래의 빌드 설정 내에서 YES로 변경합니다.

Objective-C에서의 Swift 클래스 사용

Target 내에서 ) 행 Target을 사용해야 합니다.#import "<#YourProjectName#>-Swift.h"Swift 코드를 Objective-C 코드에 노출하다

이 게시물에서는 Swift 정적 라이브러리를 Objective-C 코드로 Import하는 방법에 대해 설명합니다.

목표 C 컨슈머 -> Swift 스태틱 라이브러리

Xcode 버전 10.2.1

Swift 정적 라이브러리 생성

다음 추가 사항:

Swift API를 표시합니다.Objective-C의[대략] Swift 함수를 사용하려면

을 하고 '아주 좋다'가 있을 예요.<product_name>-Swift.h 배치해야 할 DerivedSources 을 찾을 수 파일을 찾을 수 없습니다]

Swift 스태틱 라이브러리가 있는 Objective-C 컨슈머

Drag and dropXcode[대략] 프로젝트로의 바이너리

Link Library[미정의 기호] [링크와 임베디드]

Project editor -> select a target -> General -> Linked Frameworks and Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file
//or
Project editor -> select a target -> Build Phases -> Link Binary With Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file

Library Search paths 수 ][라이브러리를 찾을 수 없음] 경로 [재귀 경로]

Project editor -> select a target -> Build Settings -> Search Paths -> Library Search paths -> add path to the parent of `lib<product_name>.a` file

Header Search Paths 을 찾을 수 없습니다듈을찾찾 을을]] ] 경로 [재귀 경로]

Project editor -> select a target -> Build Settings -> Search Paths -> Header Search Paths -> add path to generated `<product_name>-Swift.h` file 

「」을 추가합니다..swift fileObjective-C 프로젝트에 [미정의 기호]할당됩니다.Xcode가 요청하면 Create를 누릅니다.Bridging Header합니다).module_name-Bridging-Header.h및에 이 의 경로를 합니다.

Project editor -> select a target -> Build Settings -> Swift Compiler - General -> Objective-C Bridging Header

모듈을 Objective-C 클라이언트[파일을 찾을 수 없습니다] 코드로 Import합니다.

#import "module_name-Swift.h"

다른 예시는 이쪽

도 같은 를 하고 있다: 같같 i i i i i i i i i i i i i i i i i i 。myProjectModule-Swift.h을 찾을 수 없습니다」라고 하는 것은 제는 「을 찾을 수 없습니다」라고 하는 「파일을 찾을 수 없습니다.」라고 하는, 「파일을 찾을 수 없습니다.」라고 하는, 는 잘못된 타겟에 .Swift는 10.9 할 수 없습니다. X 10.9 를 설정해 .정해해설MACOSX_DEPLOYMENT_TARGET '로 9로 때 되었습니다.

문제는 -swift.h 파일의 자동생성이 CustomDebugStringConvertible 서브클래스를 인식할 수 없다는 것입니다.대신 NSObject의 하위 클래스로 클래스를 변경했습니다.그 후 -swift.h 파일에 클래스가 올바르게 포함되었습니다.

오브젝트 c 브리징헤더에 클래스를 추가하는 문제가 있었는데 Import된 오브젝트 c 헤더에서는 스위프트헤더를 Import하려고 했습니다.그건 싫었어요.

따라서 swift를 사용하지만 브리징된 모든 objective-c 클래스에서 중요한 것은 헤더에서 정방향 클래스 선언을 사용하고 "*-Swift"를 Import하는 것입니다..m 파일에 h" 파일이 있습니다.

빌드 설정을 변경하거나 클래스에 @obj를 추가할 필요가 없었습니다.

제가 해야 할 일은 Objective-c 프로젝트에 Swift 클래스를 만들 때 자동으로 생성되는 브리지 헤더를 만드는 것이었습니다.그리고 난 그냥 해야 했어

"침대-스위프트"를 가져오다.h" <- inside objective-c 파일입니다.

음, 모든 코멘트를 읽고, 읽고, 읽고, 그리고 다시 한 번 시도한 후에, 저는 빠른 수업을 제 빅 obj-c 프로젝트에 포함시킬 수 있었습니다.도와주셔서 감사합니다.과정을 더 잘 이해하는 데 도움이 되는 팁을 하나 알려드리고 싶었습니다..m 클래스에서 swift target name #import "myTargetName-Swift" Import 행으로 이동합니다.h" 라고 입력하고,키를 클릭합니다.

명령 + 마우스 클릭 -> 정의로 점프

여기서 swift에서 obj-c로의 모든 변환을 볼 수 있으며, obj-c에서 선언된 다양한 기능을 찾을 수 있습니다.이 팁이 나에게 도움이 된 만큼 당신에게도 도움이 되기를 바랍니다.

XCode 11.3.1:

swift inner 클래스를 objc 코드로 사용하고 싶은 경우, 에러 「미정의의 심볼」(need inner class와 outer class의 경우)에 대해서 컴파일 되지 않는 경우는, 생성된 「-swift」를 체크했습니다.h" 헤더와 양쪽 클래스가 있습니다.

몇 시간 동안 시도한 후 내부 클래스를 일반 클래스로 변환하면 컴파일됩니다.

프로젝트를 정리하고 Derived Data 폴더를 삭제하면 컴파일 됩니다.

수 에 는는코 the 、 는 i were from from from Swift를 삭제해야 .Objective-C Generated Interface Name도서관 자료와 상충되지 않도록 하기 위해서입니다.

아카이브는 이미 테스트 완료

목표 c 프로젝트에서 신속한 함수(스위트 프레임워크에 포함될 수도 있음)를 호출하거나 네이티브 프로젝트를 반응시키는 방법

리액트 리액트 리액트 리액트 리액트 리액트 리액트 리액션에도

빌드 설정을 열고 다음 파라미터를 확인합니다.모듈 정의 : YES

AppDelegate.h에 있습니다.

#import <React/RCTBridgeDelegate.h>
#import <UIKit/UIKit.h>

@class KB;

@interface AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeDelegate>

@property (strong, nonatomic) KB *appkb;

@end

AppDelegate.m으로 이동합니다.

#import "AppDelegate.h"
#import "ProductModuleName-Swift.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  [self.appkb methodReceiveSwiftClass];
  [self.appkb methodEvents:event prop:properties];
}

@end

KB.swift

import Foundation
// import framework if using a swift framework in objective c or react native native modules.
@objc public class KB:NSObject{
  
  @objc public func methodReceiveSwiftClass(){
    //write anything here....
  }

  @objc public func methodEvents(_ event: String, prop: String){
    //write anything here
     //func with params
  }

}

Project Module Name-Bridging-Header.h

#import "React/RCTBridgeModule.h"
#import "AppDelegate.h"

위의 모든 작업을 수행해도 오류가 발생하였습니다.문제는 제가 필요로 하는 Swift 파일이 어떤 이유로 번들리소스에 추가되지 않았다는 것입니다.

[ My Target ]> [ Build Phases ]> [ Copy Bundle Resources ]순서로 이동하여 플러스 버튼을 클릭하여 Swift 파일을 추가했습니다.

언급URL : https://stackoverflow.com/questions/24206732/cant-use-swift-classes-inside-objective-c

반응형