我尝试在我的应用程序中集成Swift代码。我的应用程序是用Objective-C编写的,我添加了一个Swift类。我做了这里描述的所有事情。但我的问题是Xcode还没有创建-Swift.h文件,只有桥接头。我创建了它,但它实际上是空的。
我可以在Swift中使用我所有的ObjC类,但我不能反之亦然。我用@objc标记了我的swift类,但它没有帮助。我现在该怎么办?
编辑:苹果说:“当你将Swift代码导入Objective-C时,你依靠xcode生成的头文件将这些文件公开给Objective-C。[…此头文件的名称是您的产品模块名称,后跟“-Swift.h”。
现在当我想导入这个文件时,它会给出一个错误:
//MainMenu.m
#import "myProjectModule-Swift.h" //Error: 'myProjectModule-Swift.h' file not found
@implementation MainMenu
这是我的FBManager.swift文件:
@objc class FBManager: NSObject {
var descr = "FBManager class"
init() {
super.init()
}
func desc(){
println(descr)
}
func getSharedGameState() -> GameState{
return GameState.sharedGameState() //OK! GameState is written in Objective-C and no error here
}
}
在Objective-C中使用Swift类
如果你要在App Target中导入代码(在一个项目中混合Objective-C和Swift),你应该使用下一个导入行#import "<#YourProjectName#>-Swift.h"将Swift代码暴露给Objective-C代码[在一个项目中混合Swift和Objective-C代码]
在这篇文章中,我将描述如何将Swift静态库导入Objective-C代码
Objective-C consumer -> Swift静态库
Xcode 10.2.1版
创建Swift静态库
跟随创建Swift静态库与下一步添加:
公开Swift API。从Objective-C中使用Swift函数[关于]
在构建之后,你应该找到一个<product_name>-Swift.h文件,该文件应该位于DerivedSources [file not found]
Objective-C消费者与Swift静态库
拖拽二进制文件到Xcode项目[关于]
链接库[未定义的符号][链接vs嵌入]
Project editor -> select a target -> General -> Linked Frameworks and Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file
//or
Project editor -> select a target -> Build Phases -> Link Binary With Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file
添加库搜索路径[未找到库][递归路径]
Project editor -> select a target -> Build Settings -> Search Paths -> Library Search paths -> add path to the parent of `lib<product_name>.a` file
添加头搜索路径[模块未找到][递归路径]
Project editor -> select a target -> Build Settings -> Search Paths -> Header Search Paths -> add path to generated `<product_name>-Swift.h` file
向Objective-C项目添加空的.swift文件。当Xcode询问时,按下Create Bridging Header(它将创建module_name-Bridging-Header.h),并为该文件设置一个路径
Project editor -> select a target -> Build Settings -> Swift Compiler - General -> Objective-C Bridging Header
导入模块到Objective-C客户端代码[文件未找到][module_name]
#import "module_name-Swift.h"
这里有更多的例子
我花了大约4个小时试图在我的基于Xcode Objective-C的项目中启用Swift。我的myproject-Swift.h文件创建成功,但我的Xcode没有看到我的swift类。所以,我决定创建一个新的基于Xcode对象的项目,最后,我找到了正确的答案!希望这篇文章能帮助到一些人:-)
Step by Step Swift integration for Xcode object -based project:
Create new *.swift file (in Xcode) or add it by using Finder.
Create an Objective-C bridging header when Xcode asks you about that.
Implement your Swift class:
import Foundation
// use @objc or @objcMembers annotation if necessary
class Foo {
//..
}
Open Build Settings and check these parameters:
Defines Module : YES
Copy & Paste parameter name in a search bar
Product Module Name : myproject
Make sure that your Product Module Name doesn't contain any special characters
Install Objective-C Compatibility Header : YES
Once you've added *.swift file to the project this property will appear in Build Settings
Objective-C Generated Interface Header : myproject-Swift.h
This header is auto-generated by Xcode
Objective-C Bridging Header : $(SRCROOT)/myproject-Bridging-Header.h
Import Swift interface header in your *.m file.
#import "myproject-Swift.h"
Don't pay attention to errors and warnings.
Clean and rebuild your Xcode project.
Profit!