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

How to import and use Swift Pod Framework in Objective-C Project

我一直在尝试检查 CocoaPods 新框架设置以使 Pods 正常运行,但我在使用 Swift 中的 Objective-C 时遇到问题] 项目。

首先,这是 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 class 中使用 CocoaPods 创建的纯 Swift 框架?

疑难解答

主要是我一直在尝试各种导入。苹果推荐@import风格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 文件单独添加到项目中,它工作得很好。

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

只需使用

@import SwiftModuleName;

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

在我的例子中没有“use_frameworks!”进入 podfile(旧项目)。

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

#import "PODNAME-Swift.h"

并使用 pod 中的 类。

但最终我无法使用那个 swift pod,因为缺少 objective c 说明。我相信在很多情况下这将是问题。