在Swift中,如何调用Objective-C代码
苹果提到它们可以在一个应用程序中共存,但这是否意味着可以在技术上重用Objective-C中的旧类,同时在Swift中构建新类
在Swift中使用Objective-C类
如果要使用现有类,请执行步骤2,然后跳到步骤5。(在某些情况下,我必须向旧的Objective-C文件中添加一个显式的
#import<;Foundation/Foundation.h
)
步骤1:添加Objective-C实现–.m
将.m
文件添加到类中,并将其命名为CustomObject.m
步骤2:添加桥接头
添加.m
文件时,可能会出现如下提示:
单击“是”
如果没有看到提示,或意外删除了桥接头,请向项目中添加一个新的.h
文件,并将其命名为<#您的项目名称#>-桥接头.h
在某些情况下,特别是在使用Objective-C框架时,您没有显式添加Objective-C类,Xcode也找不到链接器。在这种情况下,创建名为上述名称的.h
文件,然后确保在目标的项目设置中链接其路径,如下所示:
注意:
最佳做法是使用$(SRCROOT)
宏链接您的项目,这样,如果您移动您的项目,或者使用远程存储库与其他人一起处理它,它仍然可以工作$(SRCROOT)可以看作是包含.xcodeproj文件的目录。可能是这样的:
$(SRCROOT)/Folder/Folder/<#您的项目名称#>-桥接头.h
步骤3:添加Objective-C标题–.h
添加另一个.h
文件并将其命名为CustomObject.h
第四步:建立你的Objective-C类
在CustomObject.h
#导入<;基础/基础h>;
@接口CustomObject:NSObject
@属性(强,非原子)id someProperty;
-(无效)某种方法;
@结束
在CustomObject.m中
#import“CustomObject.h”
@自定义对象的实现
-(无效)某种方法{
NSLog(@“SomeMethod Ran”);
}
@结束
步骤5:将类添加到桥接头
在项目桥接头.h
中:
#import“CustomObject.h”
步骤6:使用您的对象
在someswiftffile.swift
中:
var instanceOfCustomObject=CustomObject()
instanceOfCustomObject.someProperty=“Hello World”
打印(InstanceOffcustomObject.someProperty)
InstanceOffcustomObject.someMethod()
不需要显式导入;这就是桥接头的作用
在Objective-C中使用Swift类
步骤1:创建新的Swift类
将.swift
文件添加到项目中,并将其命名为MySwiftObject.swift
在MySwiftObject.swift的中:
代码>导入基础
@objc(myswitobject)
类myswitobject:NSObject{
@objc
var someProperty:AnyObject=“Some Initializer Val”作为NSString
init(){}
@objc
func someFunction(someArg:Any)->NSString{
return“You sent me\(someArg)”
}
}
步骤2:将Swift文件导入ObjC类
在SomeRandomClass.m
中:
#import”<;#YourProjectName#>;-Swift.h”
文件:<#您的项目名称#>-Swift.h
应该已经在项目中自动创建,即使您看不到它
第三步:利用你的课堂
myswitobject*myOb=[myswitobject new];
NSLog(@“MyOb.someProperty:%@”,MyOb.someProperty);
[email protected]“你好世界”;
NSLog(@“MyOb.someProperty:%@”,MyOb.someProperty);
NSString*retString=[myOb someFunctionWithSomeArg:@“Arg”];
NSLog(@“RetString:%@”,RetString);
注:
-
如果代码完成没有达到预期效果,请尝试使用⌘⇧R帮助Xcode从Swift上下文中查找一些Objective-C代码,反之亦然
-
如果将
.swift
文件添加到旧项目中,并出现错误dyld:Library not loaded:@rpath/libswift\u stdlib\u core.dylib
,请尝试完全重新启动Xcode -
虽然最初可以通过使用
@objc
前缀使用Objective-C可见的纯Swift类(而不是NSObject
的后代),但现在已经不可能了。现在,要在Objective-C中可见,Swift对象必须是符合NSObjectProtocol
(最简单的方法是从NSObject
继承)的类,或者是标记为@objc
的枚举,带有一些整数类型的原始值,如
Int
。您可以使用@objc
查看Swift 1.x代码示例的编辑历史记录,无需这些限制