我有一个Objective-CSwift混合在一起的框架。它可以单独编译,但是当我将其导入Objective-C iOS应用程序时,找不到Swift类,但找到了Objective-C类。
导入MyFramework-Swift.h时,在框架内找到了我的Swift类iOS应用程序和框架是同一工作空间中的两个不同项目。

对于所有目标,Defines ModuleEmbedded content contains Swift Code都设置为Yes,我的Swift类通过@objc公开

我尝试使用@import MyFramework#import <MyFramework/MyFramework-Swift.h>失败。

我没有在项目的框架的Headers目录中看到MyFramework-Swift.h头文件。不知道这是否正常。它在DerivedData中生成

编辑:我设法用Xcode 8中的一个非常简单的工作区重现该问题(但在7.3中可能是相同的):

  • 在Objective-C中创建一个新的Cocoa触摸框架TestFramework
  • 创建A.h文件
    @class B;
    
    @interface A : NSObject
    
    -(void)print:(B*)caller;
    
    @end
    
  • 创建A.m文件
    #import <Foundation/Foundation.h>
    #import "TestFramework-Swift.h"
    
    #import "A.h"
    
    @implementation A
    
    -(void)print:(B*)caller {
        [caller test];
    }
    
  • 创建B.swift文件
    import Foundation
    
    @objc public class B : NSObject {
        public func test() {
            print("test");
        }
    }
    
  • A.h设置为 public 标头
  • A.h导入TestFramework.h
  • 尝试编译框架

  • 在这里找不到TestFramework-Swift.h
  • Install Objective-C compatibility header设置为No
  • 尝试编译框架

  • 现在可以编译了!
  • 创建一个新的iOS Objective-C单视图应用程序
  • 像这样更新ViewController.m
     #import "ViewController.h"
     @import TestFramework;
    
     @interface ViewController ()
    
     @end
    
     @implementation ViewController
    
     - (void)viewDidLoad {
         [super viewDidLoad];
         B* b = [[B alloc] init];
         A* a = [[A alloc] init];
         [a print: b];
     }
    [...]
    @end
    

  • 您应该在B而不是A上出错。我还在两个项目中都将Defines Module设置为Yes,但未成功

    最佳答案

    好吧,我终于找到了答案。在框架内,Install Objective-C compatibility header必须设置为Yes,导入必须是#import <TestFramework/TestFramework-Swift.h>而不是#import "TestFramework-Swift.h"

    关于ios - 导入混合框架时在iOS应用中找不到Swift类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39374266/

    10-08 21:58
    查看更多