导入混合框架时,iOS应用程序中找不到Swift类

时间:2016-09-07 15:45:26

标签: ios objective-c swift xcode

我有一个框架,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设置为公共标题

  • 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但没有成功

1 个答案:

答案 0 :(得分:2)

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