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

85

我一直在尝试使用CocoaPods新框架设置来启用一些Pods,但是在我的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中根本不存在的语言特性... - user1971598
@EdgarAroutiounian - 在某些方面你是正确的,但对于这种类型的类来说,这不应该是一个问题,因为它继承自ObjC类。此外,如果我只添加文件,我的上面的代码片段可以成功构建和运行。(请参见更新) - Logan
嗨,你的问题实际上帮了我很多,我正在尝试使用 CocoaPods 添加 FacebookSDK,但编译时遇到了错误,“import FacebookSDK”解决了问题。 - Michal Gumny
这个问题实际上非常有帮助:在Objective-C中使用@import,这是许多人从未或很少见到的,但它是新的、有用的和必要的。感谢您找出了这个方法。 - Dan Rosenstark
3个回答

49

我认为你需要将swift类声明为public,否则它将被视为内部类,只能在同一模块内见到,这可能是为什么将其作为文件添加到同一项目中可以工作,但作为框架则不行的原因。另一个我想到的是,该框架可能需要在类声明前面添加@objc,以便它可以在objective-c类中看到。此外,阅读苹果的混合使用Objective-C和Swift指南时,提到当导入外部框架时,您需要确保所导入的框架的“定义模块”构建设置已设置为“是”。您是否检查了任何这些选项?


公共的做到了!不知道为什么必须这样,但它确实发生了。我原以为公共是默认值,很高兴知道我错了。我想这会让你赢得悬赏(在3小时内),恭喜 :) - Logan
3
好的,我知道这已经晚了一年,但我觉得有义务回答这个问题(因为没有人回答)。Swift 之所以默认为内部访问权限(只能被分配的组访问)是因为有很多原因。 - Erik Bean
6
如果在Objective C项目中使用Swift框架的pod,你只需要添加 #import "<FrameworkName>-Swift.h"。在我的情况下,我需要在Objective C项目中使用Alamofire,所以我使用了 #import "Alamofire-Swift.h" 使其正常工作。 - Swaroop S
2
在我的情况下,“pod”是一个基于Swift的框架,它的“public”类别只是不会被导出,并且不会出现在生成的<framework/framework-swift.h>头文件中。现在怎么办? - Motti Shneor

13

只需使用以下语法:

@import SwiftModuleName;

确保你要使用的函数是公共的(并且带有@objc标记)。


-2
在我的情况下,podfile(旧项目)中没有“use_frameworks!”。
我添加了它,然后我就能够像这样使用导入:
#import "PODNAME-Swift.h"
并使用来自pod的类。
但最终我无法使用那个swift pod,因为缺乏objective c曝光。 我相信这将是许多情况下的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接