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


72

我一直在尝试检出CocoaPods新框架设置以使某些Pod运行起来,而在我的Objective-C项目中使用Swift时遇到了麻烦。

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

这是我当前的Podfile:

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

platform :ios, '8.0'

pod 'MBProgressHUD'
pod 'SLPagingViewSwift'

MBProgressHUD是常见的旋转指示器,SLPagingViewSwift是一个随机项目,我通过在cocoapods搜索中键入Swift来找到。这是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

这是SLPagingViewSwift声明:

class SLPagingViewSwift: UIViewController, UIScrollViewDelegate {

如您所见,它继承自UIViewController,因此只需分配它并对其进行初始化就不成问题。如果我将文件单独添加为文件,则上面的代码运行良好。我知道这行得通。

tl; dr

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

故障排除

通常,我一直在尝试各种进口产品。苹果在这里推荐@import款式

在此处输入图片说明

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

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

// Builds Fine -- Doesn't Work
#import <SLPagingViewSwift/SLPagingViewSwift-Swift.h>
#import "SLPagingViewSwift-Swift.h"

我还不时尝试其他一些Swift库,以查看是否可以单击任何东西。

在Cocoapods问题上,我看不到有什么可以解决的,在他们的博客/发行资料中也没有发现任何东西。

注意

如果我SLPagingViewSwift.swift以老式方式将文件单独添加到项目中,则效果很好。


据我了解,您总是可以从Objc转到Swift,但并非总是相反,因为Swift具有Objc中根本不存在的语言功能...
Edgar Aroutiounian 2015年

@EdgarAroutiounian-在某些方面您是正确的,但是对于此类,这应该不是问题,因为它继承自ObjC类。另外,如果我仅添加文件,则上面的代码段将构建并运行良好。(查看更新)
Logan 2015年

嘿,您的问题实际上对我有很大帮助,我试图在FacebookSDK中添加可可豆荚,并且在尝试编译时出现错误,“导入FacebookSDK”
起到

这个问题实际上非常有用:@import在Objective-C中使用-我们中许多人从未见过或很少见到的用法是新的,有用的和必要的。感谢您解决此问题。
Dan Rosenstark '02

Answers:


43

我认为您必须将swift类声明为公共类,否则它将被视为内部类,并且只能在同一模块中看到,这可能是为什么将其添加到文件中的同一项目中的原因,但是框架没有。我想到的另一件事是,框架可能需要在类声明的前面添加@objc,以便可以在Objective-C类中看到它。还阅读了Apple关于目标c和swift之间的混合匹配的指南,它说,当您导入外部框架时,需要确保要导入的框架的Defines Module build设置设置为Yes。您是否选择了其中任何一个?


公开做到了!不知道为什么一定要那样做,但是确实如此。据我了解,公开是默认设置,很高兴知道我错了。我想这会赢得您的赏金(3小时内),恭喜您:)
Logan

3
好的,我知道这已经过去了一年多,但是我有义务回答这个问题(因为没有其他人这样做)。由于许多原因,Swift默认为内部(只能由分配的组访问)。
埃里克·宾

6
如果在Objective C项目中使用使用swift框架的pod,则只需添加#import“ <FrameworkName> -Swift.h”。在我来说,我需要我的目标C项目中使用Alamofire,所以我用#进口“Alamofire-Swift.h”,使其工作..
Swaroop小号

1
在我的情况下-'pod'是一个基于swift的框架,并且它的'public'类也不会导出,也不会出现在生成的<framework / framework-swift.h>标头中。现在怎么办?
Motti Shneor


-2

就我而言,没有“ use_frameworks!” 进入podfile(旧项目)。

我添加了它,然后就可以像这样使用import

#import“ PODNAME-Swift.h”

并使用pod中的类。

但是最后,由于缺乏客观的c语言说明,我无法使用该快速窗格。我相信在很多情况下这都是问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.