我用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。注意,这是产品名称-其他答案犯了使用类名的错误。
ProductName-Swift.h
这个文件是一个自动生成的头文件,它为项目中的所有Swift类定义了Objective-C接口,这些类要么带有@objc注释,要么继承自NSObject。
@objc
NSObject
注意事项:
My Project
My_Project-Swift.h
<ProductName/ProductName-Swift.h>
苹果官网说明:
将Swift代码从相同的框架导入Objective-C 在建立设置下,在包装中,确保定义模块 为该框架目标设置是的。导入Swift代码 从框架目标到其中的任何Objective-C .m文件 框架目标使用此语法并适当替换 名称:< / p > #进口“ProductName-Swift.h”
将Swift代码从相同的框架导入Objective-C
在建立设置下,在包装中,确保定义模块 为该框架目标设置是的。导入Swift代码 从框架目标到其中的任何Objective-C .m文件 框架目标使用此语法并适当替换 名称:< / p >
#进口“ProductName-Swift.h”
修订:
只能在.m文件中导入“ProductName-Swift.h”。
目标中的Swift文件将在Objective-C .m文件中可见 . import语句 为了避免循环引用,不要将Swift导入Objective-C 头文件。相反,你可以向前声明一个Swift类来使用它 在Objective-C头文件中。注意你不能子类化一个Swift类 在objective - c中。< / p >
下面是该怎么做:
在Objective-C中创建一个新项目
创建新的.swift文件 < / p >
.swift
点击你的Xcode项目文件
点击构建设置
找到搜索栏,搜索定义模块。
修改值为是。
搜索产品模块名称.;
将该值更改为项目的名称。
在App委托中,添加以下内容:#import "YourProjectName-Swift.h"
#import "YourProjectName-Swift.h"
注意:当你想使用你的Swift文件时,你必须导入以下行:
如果你正在使用Cocoapods,并试图在ObjC项目中使用Swift pod,你可以简单地执行以下操作:
@import <FrameworkName>;
进入项目文件中的构建设置并搜索"Objective-C生成的接口头名称。该属性的值是您应该包含的名称。
如果你的“产品模块名”属性(上面的属性默认依赖的那个)根据你是否为测试/调试/发布/等进行编译而变化(就像我的情况一样),那么通过设置一个自定义名称使这个属性独立于那个变化。
如果你想使用斯威夫特文件到objective - c类中,那么从Xcode 8开始,你可以按照以下步骤:
如果您已经在Objective-C中创建了项目:
编译它,如果它会产生链接器错误,如:用较新的Swift语言版本(3.0)编译,而不是以前的文件(2.0),用于架构x86_64或armv 7
在您的
构建并运行。
第一步:-
选择项目目标->构建设置->搜索('定义')-> <强>定义模块 更新值没有到是的
"定义模块":是的。
"Always Embed Swift Standard Libraries": 是的。
“安装Objective-C兼容头”:是的。
第二步:-
在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文件会导致此错误,如果它没有正确地import。
Objective-c
Swift
import
注意:你不需要从外部导入Swift文件,你只需要导入一个文件来照顾Swift文件。
当你在objective - c的项目中创建/复制Swift文件。它会自动创建一个桥接头。
在Targets -> Build Settings处检查Objective-C Generated Interface Header Name。
Targets -> Build Settings
Objective-C Generated Interface Header Name
基于以上,我将原样导入KJExpandable-Swift.h。
KJExpandable-Swift.h
你的将是TargetName-Swift.h,其中TargetName根据你的项目名称或你可能添加并在其上运行的另一个目标而不同。
TargetName-Swift.h
TargetName
KJExpandable
在你试图构建的目标的构建设置中搜索"Objective-C生成的接口头名称"(假设它是MyApp-Swift.h),并在你试图访问Swift api的源文件中导入这个设置的值(#import "MyApp-Swift.h")。
MyApp-Swift.h
#import "MyApp-Swift.h"
该字段的默认值是$(SWIFT_MODULE_NAME)-Swift.h。如果双击“Objective-C Generated Interface Header Name”设置的值字段,就可以看到它。
$(SWIFT_MODULE_NAME)-Swift.h
同样,如果你的模块名中有破折号(假设是My-App),那么在$(SWIFT_MODULE_NAME)中所有的破折号都将被下划线取代。所以你必须添加#import "My_App-Swift.h"。
My-App
$(SWIFT_MODULE_NAME)
#import "My_App-Swift.h"
如果你将Swift代码导入到Objective-C文件在同一个地方框架中,有一个警告。你必须指定框架名和尖括号:
#import <MyFramework/MyFramework-Swift.h>
MyFramework这里是“产品模块名称”构建设置(PRODUCT_NAME = MyFramework)。
MyFramework
PRODUCT_NAME = MyFramework
简单地添加#import "MyFramework-Swift.h"是不行的。如果你检查构建的产品目录(在这样的#import被添加之前,所以你至少有一个成功的构建,目标中有一些Swift代码),那么你仍然应该在Headers目录中看到文件MyFramework-Swift.h。
#import "MyFramework-Swift.h"
#import
Headers
MyFramework-Swift.h
在项目中找到. pch文件。这将导入类头文件。这样你就不需要导入到特定的文件中。
#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的语法技巧
你不能导入'pure"函数,只有类,即使标记为“public”,所以:
public func f1(){ 打印(“f1"); } < / p >
将不会以任何方式调用。
如果你写类。,从NSObject中添加继承,其他将不可用。
如果它继承自NSObject,如下所示:
类Utils: NSObject{
static func aaa() > 返回“AAA" } < / p >
@objc static func bbb()->字符串{ 返回“BBB" } < / p >
@objc private static func ccc() >字符串{ 返回“CCC" } < / p >
}
在OBJC:
aaa()未被调用:"选择器'aaa'没有已知的类方法;
bbb()好
ccc()未调用:"选择器'aaa'没有已知的类方法;