来自Swift的C代码
在Apple的新Swift语言中,如何调用Objective-C代码?
Apple提到它们可以共存于一个应用程序中,但是这是否意味着可以在技术上重新使用Objective-C中制作的旧类,同时在Swift中构建新类?
推理
Objective-C是一种独立于平台的语言,而Swift是平台依赖的。 因此,在Swift中编写非平台相关的代码(业务逻辑库)不是明智之举。 但是,编写与平台相关的代码(例如,相关接口)将会非常好。 并不是说这将是一个好主意,但它绝对是一种兴趣。
在Swift中使用Objective-C类
**如果您有一个您想使用的现有类,请执行步骤2,然后跳到步骤5.(对于某些情况,我必须将明确的#import <Foundation/Foundation.h
添加到较旧的Objective- C文件)。**
第1步:添加Objective-C实现 - .m
将.m
文件添加到您的类中,并将其命名为CustomObject.m
。
第2步:添加桥接头
添加.m
文件时,您可能会看到如下所示的提示:
点击是!
如果您没有看到提示,或者意外删除了桥接头,请在项目中添加一个新的.h
文件并将其命名为<#YourProjectName#>-Bridging-Header.h
您的项目名称<#YourProjectName#>-Bridging-Header.h
。
在某些情况下,特别是使用Objective-C框架时,不要明确添加Objective-C类,并且Xcode无法找到链接器。 在这种情况下,创建如上所述命名的.h
文件,然后确保将其路径链接到目标的项目设置中,如下所示:
注意
最好的做法是使用$(SRCROOT)
宏链接项目,这样如果您移动项目或使用远程存储库与其他项目一起工作,它仍然可以工作。 $(SRCROOT)
可以被认为是包含你的.xcodeproj文件的目录。 它可能看起来像这样:
$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h
第3步:添加Objective-C标题 - .h
添加另一个.h
文件并将其命名为CustomObject.h
。
第4步:构建您的Objective-C类
在CustomObject.h
#import <Foundation/Foundation.h>
@interface CustomObject : NSObject
@property (strong, nonatomic) id someProperty;
- (void) someMethod;
@end
在CustomObject.m
#import "CustomObject.h"
@implementation CustomObject
- (void) someMethod {
NSLog(@"SomeMethod Ran");
}
@end
第5步:将类添加到桥接头
在YourProject-Bridging-Header.h
:
#import "CustomObject.h"
第6步:使用你的对象
在SomeSwiftFile.swift
:
var instanceOfCustomObject: CustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
println(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()
没有必要明确导入; 这就是桥接头的作用。
在Objective-C中使用Swift类
第1步:创建新的Swift类
将.swift
文件添加到您的项目中,并将其命名为MySwiftObject.swift
。
在MySwiftObject.swift
:
import Foundation
class MySwiftObject : NSObject {
var someProperty: AnyObject = "Some Initializer Val"
init() {}
func someFunction(someArg:AnyObject) -> String {
var returnVal = "You sent me (someArg)"
return returnVal
}
}
第2步:将Swift文件导入ObjC类
在SomeRandomClass.m
:
#import "<#YourProjectName#>-Swift.h"
文件: <#YourProjectName#>-Swift.h
您的项目<#YourProjectName#>-Swift.h
应该已经在您的项目中自动创建,即使您看不到它。
第3步:使用你的班级
MySwiftObject * myOb = [MySwiftObject new];
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
myOb.someProperty = @"Hello World";
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
NSString * retString = [myOb someFunction:@"Arg"];
NSLog(@"RetString: %@", retString);
注意:
CodeCompletion的表现并不像我想要的那么准确。 在我的系统上,使用“cmd + r”运行快速构建似乎有助于Swift找到一些Objective-C代码,反之亦然。
2.如果将.swift
文件添加到较旧的项目并出现错误: dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
,请尝试完全重新启动Xcode。
3.尽管在Swift 2.0之后,通过使用@objc
前缀在Objective-C中最初可能使用纯Swift类,但这不再可能。 请参阅编辑历史以获取原始说明 如果此功能在未来的Swift版本中重新启用,则答案将相应更新。
请参阅Apple在Cocoa和Objective-C中使用Swift的指南。 本指南介绍了如何使用Swift中的Objective-C和C代码,反之亦然,并提供了如何转换项目或在现有项目中混合匹配Objective-C / C和Swift部件的建议。
编译器自动生成调用C函数和Objective-C方法的Swift语法。 从文档中可以看出,这个Objective-C:
UITableView *myTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
变成这个Swift代码:
let myTableView: UITableView = UITableView(frame: CGRectZero, style: .Grouped)
Xcode也可以随时进行这种翻译 - 您可以在编辑Swift文件时使用Open Quickly并键入一个Objective-C类名称,它将带您到类头的Swift ified版本。 (你也可以通过在一个Swift文件中用cmd单击一个API符号来获得这个)。在Objective-C和Swift中都可以看到iOS 8和OS X v10.10(Yosemite)开发库中的所有API参考文档形式(例如UIView
)。
以下是在Swift项目中使用Objective-C代码(在这种情况下,由第三方提供的框架)的分步说明:
简单步骤:
出现一个提示符,然后单击确定...如果它没有出现,那么我们手动创建它,如下所示...从iOS源创建一个头文件并给出名称ProjectName-Bridging-Header(示例:Test -Bridging-Header),然后在Swift编译器代码 - > Objective-C桥添加Objective-C桥名称(Test / Test-Bridging-Header.h)中进入编译设置。 是的,这是完整的。
或者,删除您添加的Objective-C文件(在上面的GIF图像中命名为“任何”)。 你不再需要它了。
打开桥接头文件 - 文件名的格式为[YourProject] --ridging-Header.h 。 它包含一个Xcode提供的评论。 为要包含的Objective-C文件添加一行代码 ,例如第三方框架。 例如,要将Mixpanel添加到项目中,您需要将以下代码行添加到桥接头文件中:
#import "Mixpanel.h"
现在在任何Swift文件中,您都可以使用现有的Objective-C代码,Swift语法 (在这个例子中,您可以调用Mixpanel SDK方法等)。 您需要熟悉Xcode如何将Objective-C转换为Swift。 苹果的指南是一个快速阅读。 或者查看一个不完整摘要的答案。
Mixpanel示例:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
Mixpanel.sharedInstanceWithToken("your-token")
return true
}
而已!
注意: 如果从项目中删除桥接头文件,请务必进入“生成设置”并删除“Swift编译器 - 代码生成”下的“ Objective-C桥接头 ”的值。
链接地址: http://www.djcxy.com/p/45761.html上一篇: C code from Swift