我在Swift中编写了一个库,但我无法将其导入到当前项目中,用Objective-C编写。
有没有办法导入它?
#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found
答案 0 :(得分:373)
您需要导入TargetName-Swift.h
。请注意,它是目标名称 - 其他答案错误地使用了类名。
此单个文件是一个自动生成的标头,它为项目中的所有Swift类定义Objective-C接口,这些接口使用@objc
注释或从NSObject
继承。
考虑:
如果目标名称包含空格,请将其替换为下划线(例如My Project
变为My_Project-Swift.h
)
如果您的目标是框架,则需要导入<TargetName/TargetName-Swift.h>
确保您的Swift文件是目标
答案 1 :(得分:137)
Apple网站上的说明:
从同一框架将Swift代码导入Objective-C
在构建设置下,在打包中,确保定义模块 该框架目标的设置设置为是。导入Swift代码 从该框架目标到其中的任何Objective-C .m文件 框架目标使用此语法并替换相应的 名称:
#import&#34; ProductName-Swift.h&#34;
<强>修订:强>
您只能在.m文件中导入&#34; ProductName-Swift.h&#34; 。
目标中的Swift文件将在Objective-C .m文件中可见 包含此导入语句。
要避免循环引用,请不要将Swift导入Objective-C 头文件。相反,您可以转发声明Swift类来使用它 在Objective-C标题中。请注意,您不能将Swift类子类化 在Objective-C中。
答案 2 :(得分:130)
以下是该怎么做:
在Objective-C中创建一个新项目
创建新的.swift
文件
点击 Xcode项目文件
点击构建设置
找到搜索栏并搜索定义模块。
将值更改为是。
搜索产品模块名称。
将值更改为项目名称。
在App代理中,添加以下内容:#import "YourProjectName-Swift.h"
注意:每当您想要使用Swift文件时,必须按照以下行导入:
#import "YourProjectName-Swift.h"
答案 3 :(得分:32)
答案 4 :(得分:16)
转到项目文件中的构建设置,然后搜索&#34; Objective-C生成的界面标题名称。 该属性的值是您应该包含的名称。
如果您的&#34;产品模块名称&#34;属性(默认情况下上面属性所依赖的属性)取决于您是否编译test / debug / release / etc(就像我的情况一样),然后通过设置自定义名称使该属性独立于该变体。
答案 5 :(得分:11)
在Swift
内导入Objective-c
文件可能会导致此错误,如果它没有import
正确的话。
注意:您不必在外部导入Swift文件,只需导入一个文件即可处理swift文件。
在 Objective-C项目中创建/复制Swift文件时。它会自动创建一个桥接头。
在Objective-C Generated Interface Header Name
处查看Targets -> Build Settings
。
基于以上所述,我将按原样导入KJExpandable-Swift.h
。
您的TargetName-Swift.h
,TargetName
根据您的项目名称或您可能添加并运行的其他目标而有所不同。
答案 6 :(得分:9)
第一步: -
选择项目目标 - &gt;构建设置 - &gt;搜索('定义') - &gt; 定义模块 将值否更新为是
“定义模块”:是。
“始终嵌入Swift标准库”:是。
“安装Objective-C兼容性标题”:是。
第二步: -
在Objective C“.h”文件中添加Swift文件类,如下所示
#import <UIKit/UIKit.h>
@class TestViewController(Swift File);
@interface TestViewController(Objective C File) : UIViewController
@end
在Objective C“.m”文件中导入'ProjectName(您的项目名称)-Swift.h'
//TestViewController.m
#import "TestViewController.h"
/*import ProjectName-Swift.h file to access Swift file here*/
#import "ProjectName-Swift.h"
答案 7 :(得分:8)
如果您要将Swift代码导入同一框架内的Objective-C文件,则需要注意一点。您必须通过指定框架名称和尖括号来执行此操作:
#import <MyFramework/MyFramework-Swift.h>
MyFramework
这是&#34;产品模块名称&#34;构建设置(PRODUCT_NAME = MyFramework
)。
只需添加#import "MyFramework-Swift.h"
即可。如果你检查构建的产品目录(在添加这样的#import
之前,所以你在目标中至少有一个成功构建了一些Swift代码),那么你仍然应该看到文件{{1在MyFramework-Swift.h
目录中。
答案 8 :(得分:5)
如果您有一个在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/
答案 9 :(得分:4)
在同一个项目中查看有关Swift和Objective C的预发行说明
您应该导入
#import "SCLAlertView-Swift.h"
答案 10 :(得分:3)
在您要构建的目标的构建设置中搜索“Objective-C生成的界面标题名称”(假设它是MyApp-Swift.h
),并导入值您尝试访问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"
。
答案 11 :(得分:2)
如果您想将 Swift 文件用于 Objective-C 类,那么从Xcode 8开始,您可以按照以下步骤操作:
如果您已在Objective-C中创建项目:
编译它,如果它会生成链接器错误,例如:使用较新版本的Swift语言(3.0)编译,而不是以前的文件(2.0),用于体系结构x86_64或armv 7
在
中再做一次更改构建并运行。
答案 12 :(得分:1)
#import <TargetName-Swift.h>
当您从#import <键盘输入时,您会看到,然后Xcode会自动为您提供建议。
答案 13 :(得分:0)
答案 14 :(得分:-1)
在项目中找到.PCH文件。然后添加The following packages will be DOWNGRADED:
conda: 4.5.4-py27_0 --> 4.2.16-py27_0
conda-build: 3.10.5-py27_0 --> 3.9.2-py27_0
Proceed ([y]/n)? y
Preparing transaction: done
Verifying transaction: done
Executing transaction: failed
ERROR conda.core.link:_execute(502): An error occurred while uninstalling
package 'defaults::conda-build-3.10.5-py27_0'.
WindowsError(5, 'Access is denied')
Attempting to roll back.
Rolling back transaction: done
WindowsError(5, 'Access is denied')
这将导入类标题。这样您就不必导入特定文件。
#import "YourProjectName-Swift.h"