我已经在Swift中编写了一个库,但无法将其导入到用Objective-C编写的当前项目中。
有什么方法可以导入吗?
#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found
我已经在Swift中编写了一个库,但无法将其导入到用Objective-C编写的当前项目中。
有什么方法可以导入吗?
#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found
Answers:
您需要导入TargetName-Swift.h
。请注意,这是目标名称-其他答案会导致使用类名称的错误。
这个单个文件是一个自动生成的标头,它为项目中所有用注释@objc
或继承的Swift类定义了Objective-C接口NSObject
。
注意事项:
如果您的目标名称包含空格,请用下划线替换(例如,My Project
成为My_Project-Swift.h
)
如果您的目标是框架,则需要导入 <TargetName/TargetName-Swift.h>
确保您的Swift文件是目标文件的成员
Apple网站上的说明:
从同一框架将Swift代码导入Objective-C
在“ 打包设置”下的“ 构建设置”下,确保该 框架目标的“ 定义模块”设置被设置为“ 是”。使用以下语法并将相应的名称替换为该框架目标中的Swift代码到该框架目标中的任何Objective-C .m文件中:
#import“ ProductName-Swift.h”
修订版:
您只能在.m文件中导入“ ProductName-Swift.h”。
目标中的Swift文件将在包含此import语句的Objective-C .m文件中可见。
为了避免循环引用,请不要将Swift导入到Objective-C头文件中。相反,您可以向前声明一个Swift类,以在Objective-C标头中使用它。请注意,您不能在Objective-C中继承Swift类。
NSObject
!!! 您不能立即class Blah
迅速声明a 并使其起作用。它必须是class Blah : NSObject
这是做什么的:
在Objective-C中创建一个新项目
创建一个新.swift
文件
点击您的Xcode项目文件
点击构建设置
找到搜索栏,然后搜索“ 定义模块”。
将值更改为Yes。
搜索产品模块名称。
将值更改为您的项目的名称。
在应用程序委托中,添加以下内容: #import "YourProjectName-Swift.h"
注意: 无论何时要使用Swift文件,都必须在以下行中导入:
#import "YourProjectName-Swift.h"
Defines module
在Build settings
给Yes
什么东西固定给我!
YourProjectName
在#import "YourProjectName-Swift.h"
将项目的名称从第8步有用的,如果你的项目名称包含特殊字符,你不知道你应该究竟如何格式化。
转到项目文件中的构建设置,然后搜索“ Objective-C生成的接口头名称。”该属性的值是您应包括的名称。
如果您的“产品模块名称”属性(上述属性默认情况下所依赖的属性)根据您是否为test / debug / release / etc进行编译而有所不同(就像我的情况一样),则使该属性独立于通过设置自定义名称来实现变体。
如果未正确导入Swift
文件Objective-c
,则可能导致此错误import
。
注意:您不必从外部导入Swift文件,只需导入一个文件即可处理swift文件。
当你创建/复制的斯威夫特文件中的Objective-C项目。它会自动创建一个桥接头。
Objective-C Generated Interface Header Name
在处检查Targets -> Build Settings
。
基于以上内容,我将按KJExpandable-Swift.h
原样导入。
您的名称将是TargetName-Swift.h
,其中TargetName
根据您的项目名称或您可能已添加并在其上运行的另一个目标而有所不同。
第一步:-
选择项目目标->构建设置->搜索('定义')-> 定义模块 更新值,从否到是
“定义模块”:YES。
“始终嵌入Swift标准库”:是。
“安装Objective-C兼容性标题”:是。
第二步:-
在目标C“ .h”文件中添加Swift文件类,如下所示
#import <UIKit/UIKit.h>
@class TestViewController(Swift File);
@interface TestViewController(Objective C File) : UIViewController
@end
在目标C“ .m”文件中导入“ ProjectName(您的项目名称)-Swift.h”
//TestViewController.m
#import "TestViewController.h"
/*import ProjectName-Swift.h file to access Swift file here*/
#import "ProjectName-Swift.h"
如果要在同一框架内将Swift代码导入到Objective-C文件中,则有一个警告。您必须指定框架名称和尖括号:
#import <MyFramework/MyFramework-Swift.h>
MyFramework
这是“产品模块名称”构建设置(PRODUCT_NAME = MyFramework
)。
简单地添加#import "MyFramework-Swift.h"
将不起作用。如果检查生成的产品目录(在#import
添加该目录之前,因此您至少已成功完成构建并在目标中添加了一些Swift代码),那么您仍应MyFramework-Swift.h
在Headers
目录中看到该文件。
如果您有一个在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和Objective C的预发行说明
您应该导入
#import "SCLAlertView-Swift.h"
The name of this header is your product module name followed by adding "-Swift.h".
因此,它不是您编写的类名,而是产品模块的名称,它负责导入所有快速文件,而不仅仅是一个特定的文件
在您要构建的目标的“构建设置”中搜索“ Objective-C生成的接口头名称”(假设是MyApp-Swift.h
),然后将此设置的值(#import "MyApp-Swift.h"
)导入您要访问的源文件中您的Swift API。
此字段的默认值为$(SWIFT_MODULE_NAME)-Swift.h
。如果双击“ Objective-C生成的接口头名称”设置的值字段,则可以看到它。
此外,如果模块名称中带有破折号(假设是My-App
),则$(SWIFT_MODULE_NAME)
所有破折号都将被下划线替换。因此,您必须添加#import "My_App-Swift.h"
。
如果要将Swift文件用于Objective-C类,那么从Xcode 8开始,您可以按照以下步骤操作:
如果您在Objective-C中创建了项目:
对其进行编译,如果它会生成链接器错误,例如:对于架构x86_64或armv 7,使用比以前的文件(2.0)更高的Swift语言(3.0)版本进行编译。
再改变一次
生成并运行。
在项目中找到.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