如何在Objective-C项目中导入和使用Swift Pod Framework

Log*_*gan 69 objective-c cocoapods swift

我一直在尝试检查CocoaPods的新框架设置,以便让一些Pod继续运行,而我在使用我的Objective-C项目中的Swift问题时遇到了麻烦.

首先,这是CocoaPods预发布0.35,您可以在这里阅读有关如何使用和安装它的信息.

这是我当前的Podfile:

source 'https://github.com/CocoaPods/Specs.git'

platform :ios, '8.0'

pod 'MBProgressHUD'
pod 'SLPagingViewSwift'
Run Code Online (Sandbox Code Playgroud)

MBProgressHUD是一个常见的旋转指示器,SLPagingViewSwift是一个随机项目,我通过将Swift键入cocoapods搜索找到.这是ViewController.m在我的项目中:

#import "ViewController.h"

@import SLPagingViewSwift;
@import MBProgressHUD;

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    // Works just fine
    MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:self.view];
    [self.view addSubview:hud];
    [hud show:YES];

    // Causes Error -- Won't build
    SLPagingViewSwift *sl = [[SLPagingViewSwift alloc] init];
}

@end
Run Code Online (Sandbox Code Playgroud)

这是SLPagingViewSwift宣言:

class SLPagingViewSwift: UIViewController, UIScrollViewDelegate {
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它继承自UIViewController,因此分配它并初始化它不应该是一个问题.如果我将文件单独添加为文件,上面的代码运行就好了.我知道它有效.

TL;博士

如何在纯Objective-C类中使用CocoaPods创建的纯Swift框架?

故障排除

大多数情况下,我一直在尝试各种进口.Apple推荐这里@import风格

在此输入图像描述

但我一直在尝试其他多种品种:

// Compiler Error
#import <SLPagingViewSwift/SLPagingViewSwift.h>

// Builds Fine -- Doesn't Work
#import <SLPagingViewSwift/SLPagingViewSwift-Swift.h>
#import "SLPagingViewSwift-Swift.h"
Run Code Online (Sandbox Code Playgroud)

我也不时尝试其他几个Swift库,看看我是否可以点击任何东西.

我没有看到有关Cocoapods问题的任何内容,我也没有在他们的博客/发布内容中找到任何内容.

注意

如果我SLPagingViewSwift.swift以旧式方式将文件单独添加到项目中,它就可以正常工作.

小智 41

我认为你必须将swift类声明为public,否则它被视为内部类,只能在同一模块中看到,这可能是为什么将它添加到与文件相同的项目中的原因,但是框架没有.我遇到的另一件事是框架可能需要在类声明前面添加@objc,以便在objective-c类中看到它.另外,在Objective c和swift之间阅读Apple的Mix and Match指南时,它表示当您导入外部框架时,需要确保将要导入的框架的Defines Module构建设置设置为Yes.你检查过这些选项吗?

  • 如果在Objective C项目中使用swift框架使用pod,则需要添加#import"<FrameworkName> -Swift.h".在我的情况下,我需要在我的客观C项目中使用Alamofire,所以我使用#import"Alamofire-Swift.h"来使其工作.. (4认同)
  • 好吧,我知道这已经晚了一年多,但我觉得有必要回答这个问题(因为没有其他人这样做).由于许多原因,Swift默认为内部(仅可由指定的组访问). (3认同)
  • 就我而言 - “pod”是一个基于 swift 的框架,它的“公共”类不会被导出,也不会出现在生成的 &lt;framework/framework-swift.h&gt; 标头中。现在怎么办? (2认同)

Jor*_*vol 6

强制使用

@import SwiftModuleName;

语法,并确保您要使用的函数是公共的(和@objc)