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

时间:2015-01-17 02:50:37

标签: objective-c swift cocoapods

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

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

这是我当前的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框架?

疑难解答

我一直在尝试各种进口。 Apple推荐使用@import样式here

enter image description here

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

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

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

我也不时尝试其他一些Swift库,看看我是否可以点击任何内容。

我在Cocoapods问题上没有看到任何有助于此的问题,我也没有在他们的博客/发布内容中找到任何内容。

注意

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

3 个答案:

答案 0 :(得分:40)

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

答案 1 :(得分:1)

Jus使用

@import SwiftModuleName;

语法,并确保要使用的功能是公共的(和@objc)

答案 2 :(得分:-2)

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

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

#import“ PODNAME-Swift.h”

并使用pod中的类。

但是最后,由于缺乏客观的c解释,我无法使用该快捷盒。我相信在很多情况下这都是问题。