在Swift中,如何调用Objective-C代码?
苹果提到它们可以共存于一个应用程序中,但这是否意味着人们可以在技术上重用Objective-C中创建的旧类,同时在Swift中构建新类?
在Swift中,如何调用Objective-C代码?
苹果提到它们可以共存于一个应用程序中,但这是否意味着人们可以在技术上重用Objective-C中创建的旧类,同时在Swift中构建新类?
当前回答
使任何Swift类的NSObject子类也有意义,我更喜欢使用任何Swift类在Objective-C类中看到,如:
@objc(MySwiftClass)
@objcMembers class MySwiftClass {...}
其他回答
登录的答案工作良好,除了在最新的Swift 5,它给出了一些编译器错误。以下是针对Swift 5开发人员的修复。
斯威夫特5
import Foundation
class MySwiftObject : NSObject {
var someProperty: AnyObject = "Some Initializer Val" as AnyObject
override init() {}
func someFunction(someArg:AnyObject) -> String {
let returnVal = "You sent me \(someArg)"
return returnVal
}
}
在Xcode 10.1中的Swift 4.2.1项目中,您可以轻松地添加Objective-C文件。按照以下步骤将Objective-C文件连接到Swift项目。
Step_01:使用Swift语言创建新的Xcode项目:
文件>新建>项目> objc。
在Swift项目中添加新的Objective-C文件:
File >新建>文件…> macOS > Objective-C文件。
Step_03:如果你第一次添加一个新的Objective-C文件到Swift项目中,Xcode会问你:
你想配置一个Objective-C桥接头吗?
Step_04:选择选项:
创建桥接头。
Step_05:将生成一个对应的文件,文件的名称如下:
Objc-Bridging-Header.h。
Step_06:现在,你需要在桥标头中设置桥文件路径。在项目导航器中单击名称为objc的项目,然后选择:
> Objective-C桥接头> objc桥接头。h
将Objc-Bridging-Header.h拖放到该框中生成文件路径。
打开你的Objc-Bridging-Header.h文件,并导入你想要在Swift文件中使用的Objective-C文件。
#import "SpecialObjcFile.m"
下面是SpecialObjcFile.m的内容:
#import <Foundation/Foundation.h>
@interface Person: NSObject {
@public
bool busy;
}
@property
bool busy;
@end
现在在你的Swift文件中,你可以使用一个Objective-C类:
override func viewDidLoad() {
super.viewDidLoad()
let myObjcContent = Person()
print(myObjcContent.busy)
}
混合Objective-C和Swift
高层图:
相同的目标
//Objective-C exposes API for Swift thought <target_name>-Bridging-Header.h
.swift uses .h.m = Swift consumer, Objective-C producer = <target_name>-Bridging-Header.h
//Swift exposes API for Objective-C thought <target_name>-Swift.h
.h.m uses .swift = Objective-C consumer, Swift producer = <target_name>-Swift.h
Swift消费者,Objective-C生产者
添加一个新的头文件。h和实现文件。m - Cocoa类文件(Objective-C) 例如<MyFileName>.h和<MyFileName>.m 配置桥接报头 当您看到“是否想配置Objective-C桥接头”时,单击“是” <target_name>-Bridging-Header.h将自动生成 构建设置-> Objective-C桥接头(SWIFT_OBJC_BRIDGING_HEADER) 将类添加到桥接头 在<target_name>-Bridging-Header.h中添加一行#import "<MyFileName>.h"
之后你可以使用Swift Objective-C的MyFileName.h,MyFileName.m
附注:如果你要添加一个现有的Objective-C文件到Swift项目中,请预先添加Bridging-Header.h并导入它
Objective-C消费者,Swift生产者
添加一个<MyFileName>.swift和extends NSObject 将Swift文件导入ObjC类 在Objective-C文件中添加#import "<target_name>-Swift.h" 通过@objc公开Swift代码[关于]
在此之后,您可以使用Objective-C Swift的<MyFileName>.swift
[<product_name>-Swift.h文件未找到]
不同的目标 (。modulemap]和[伞盖.h]用于暴露Objective-C for Swift。Swift.h用于为Objective-C公开Swift代码
(词汇)
你可以看看Swift & Cocoapods的帖子。基本上,我们需要创建一个桥接头文件,并将所有Objective-C头文件放在那里。然后我们需要从构建设置中引用它。之后,我们可以使用Objective-C代码。
let manager = AFHTTPRequestOperationManager()
manager.GET(
"http://example.com/resources.json",
parameters: nil,
success: { (operation: AFHTTPRequestOperation!,
responseObject: AnyObject!) in
println("JSON: " + responseObject.description)
},
failure: { (operation: AFHTTPRequestOperation!,
error: NSError!) in
println("Error: " + error.localizedDescription)
})
也可以看看苹果的文档Using Swift with Cocoa和Objective-C。
创建桥接头后,进入构建设置=>搜索“Objective-C桥接头”。
就在下面你会发现“Objective-C Generated Interface Header Name”文件。
在视图控制器中导入那个文件。
例子:在我的例子中:“Dauble-Swift.h”