我用Swift写了一个库,但我不能把它导入到我目前用Objective-C写的项目中。

有什么方法可以导入吗?

#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found

在同一个项目中检查Swift和Objective C的发布前说明

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_75

你应该导入

#import "SCLAlertView-Swift.h"

需要导入“ProductName-Swift.h”。注意,这是产品名称-其他答案犯了使用类名的错误。

这个文件是一个自动生成的头文件,它为项目中的所有Swift类定义了Objective-C接口,这些类要么带有@objc注释,要么继承自NSObject。

注意事项:

如果你的产品名称包含空格,用下划线替换它们(例如,My Project变成My_Project-Swift.h) 如果您的目标是一个框架,您需要导入<ProductName/ProductName- swift .h> 确保你的Swift文件是目标的成员


苹果官网说明:

将Swift代码从相同的框架导入Objective-C 在构建设置下,在打包中,确保定义模块 该框架目标的设置被设置为Yes。导入Swift代码 从框架目标到其中的任何Objective-C .m文件 框架目标使用此语法并适当替换 的名字: #进口“ProductName-Swift.h”

修订:

只能导入。m格式的“ProductName-Swift.h”。

目标中的Swift文件将在Objective-C .m文件中可见 包含此导入语句。 为了避免循环引用,不要将Swift导入Objective-C 头文件。相反,你可以向前声明一个Swift类来使用它 在Objective-C头文件中。注意你不能子类化一个Swift类 在objective - c中。


下面是该怎么做:

在Objective-C中创建一个新项目 创建一个新的.swift文件   将会出现一个弹出窗口并询问“您是否想配置一个Objective-C桥接头”。 选择Yes。 点击Xcode项目文件 点击构建设置 找到搜索栏并搜索定义模块。 将“value”修改为“Yes”。 搜索“产品模块名称”。 将该值更改为项目的名称。 在App委托中,添加以下内容:


注意:无论何时你想使用你的Swift文件,你必须导入以下行:

#进口“YourProjectName-Swift.h”


如果你正在使用Cocoapods,并试图在ObjC项目中使用Swift pod,你可以简单地执行以下操作:

@import < FrameworkName >;


转到项目文件中的构建设置,搜索“Objective-C生成的接口头名称”。该属性的值是您应该包含的名称。

如果你的“产品模块名”属性(上面的属性默认依赖的那个)根据你是否为测试/调试/发布/等进行编译而变化(就像我的情况一样),那么通过设置一个自定义名称使这个属性独立于那个变化。


如果你想使用Swift文件到Objective-C类,那么从Xcode 8开始,你可以按照以下步骤:

如果您已经在Objective-C中创建了项目:

创建新的Swift文件 Xcode会自动提示输入桥头文件 产生它 在Objective-C控制器中导入"Project_Name-Swift.h"(在实现中导入,而不是在接口中导入)(如果你的项目名称之间有空格,那么使用下划线"Project_Name-Swift.h") 你将能够在Swift中访问你的Objective-C类。

编译它,如果它会产生链接器错误,如:用较新的Swift语言版本(3.0)编译,而不是以前的文件(2.0),用于架构x86_64或armv 7

在您的

Xcode ->项目->目标->构建设置->使用传统Swift语言版本->是

构建并运行。


第一步:-

选择项目目标->构建设置->搜索(“定义”)->定义模块 将值从No更新为Yes

“定义模块”:YES。

“总是嵌入Swift标准库”:是的。

“安装Objective-C兼容头”:YES。

第二步:-

在Objective C“.h”文件中添加Swift文件类,如下所示

#import <UIKit/UIKit.h>

@class TestViewController(Swift File);

@interface TestViewController(Objective C File) : UIViewController

@end

在Objective C中导入“ProjectName(你的项目名)-Swift.h”。m”文件

//TestViewController.m 
#import "TestViewController.h"

/*import ProjectName-Swift.h file to access Swift file here*/

#import "ProjectName-Swift.h"

在Objective-c中导入Swift文件会导致这个错误,如果导入不正确的话。

注意:你不需要从外部导入Swift文件,你只需要导入一个文件来照顾Swift文件。

当你在Objective-C项目中创建/复制Swift文件时。它会自动创建一个桥接头。

检查Objective-C生成的接口头名称在目标->构建设置。

基于以上,我将按原样导入KJExpandable-Swift.h。

你的将是TargetName- swift .h,其中TargetName根据你的项目名称或你可能添加并在其上运行的另一个目标而不同。

因为下面我的目标是KJExpandable,所以它是KJExpandable- swift .h


在你要构建的目标的构建设置(假设是MyApp-Swift.h)中搜索“Objective-C生成的接口头名称”,并在你要访问Swift api的源文件中导入这个设置的值(#import“MyApp-Swift.h”)。

该字段的默认值是$(SWIFT_MODULE_NAME)-Swift.h。如果双击“Objective-C Generated Interface Header Name”设置的值字段,就可以看到它。

同样,如果在模块名中有破折号(假设是My-App),那么在$(SWIFT_MODULE_NAME)中所有的破折号都将被下划线替换。然后你需要添加#import "My_App-Swift.h"。


如果你在同一个框架中将Swift代码导入到Objective-C文件中,有一个警告。你必须指定框架名和尖括号:

# < MyFramework /进口MyFramework-Swift.h >

这里是“产品模块名称”构建设置(PRODUCT_NAME = MyFramework)。

简单地添加#import“myframe - swift .h”是行不通的。如果你检查构建的产品目录(在添加#import之前,所以你至少有一个成功的构建目标中有一些Swift代码),那么你仍然应该在Headers目录中看到文件myframe -Swift.h。


在项目中找到. pch文件。然后添加#import "YourProjectName-Swift.h"这将导入类头文件。这样你就不需要导入到特定的文件中。

#ifndef __IPHONE_3_0
#warning "This project uses features only available in iPhone SDK 3.0 and later."
#endif


#ifdef __OBJC__
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    #import "YourProjectName-Swift.h"
#endif

如果你在Swift 4中创建了一个项目,然后添加了Objective-C文件,这样做:

@objcMembers
public class MyModel: NSObject {
    var someFlag = false         
    func doSomething() {         
        print("doing something")
    }
}

参考:https://useyourloaf.com/blog/objc-warnings-upgrading-to-swift-4/


小心使用破折号和下划线,它们可能会混淆,并且您的项目名称和目标名称不会与SWIFT_MODULE_NAME相同。


#import <TargetName-Swift.h>

当你从键盘输入#import <时,你会看到Xcode会自动提示你。


只是一些关于Xcode的语法技巧

你不能导入“纯”函数,只能导入类,即使标记为“public”,所以: 公共函数f1(){ 打印(f1); }

将不会以任何方式调用。

如果你写类。,从NSObject中添加继承,其他将不可用。 如果它继承自NSObject,如下所示: 类Utils: NSObject{ static func aaa()->字符串{ 返回“AAA” } @objc static func bbb()->字符串{ 返回" BBB " } @objc private static func ccc()->字符串{ 返回“CCC” } }

在OBJC:

aaa()未调用:"没有已知的类方法的选择器'aaa'"

bbb() ok

ccc() NOT called: "没有已知的类方法的选择器'aaa'"