如何从Swift调用Objective-C代码?

在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文件,并将其命名为&lt#您的项目名称#&gt-桥接头.h

在某些情况下,特别是在使用Objective-C框架时,您没有显式添加Objective-C类,Xcode也找不到链接器。在这种情况下,创建名为上述名称的.h文件,然后确保在目标的项目设置中链接其路径,如下所示:

注意:

最佳做法是使用$(SRCROOT)宏链接您的项目,这样,如果您移动您的项目,或者使用远程存储库与其他人一起处理它,它仍然可以工作$(SRCROOT)可以看作是包含.xcodeproj文件的目录。可能是这样的:

$(SRCROOT)/Folder/Folder/&lt#您的项目名称#&gt-桥接头.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”

文件:&lt#您的项目名称#&gt-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);

注:

  1. 如果代码完成没有达到预期效果,请尝试使用R帮助Xcode从Swift上下文中查找一些Objective-C代码,反之亦然

  2. 如果将.swift文件添加到旧项目中,并出现错误dyld:Library not loaded:@rpath/libswift\u stdlib\u core.dylib,请尝试完全重新启动Xcode

  3. 虽然最初可以通过使用@objc前缀使用Objective-C可见的纯Swift类(而不是NSObject的后代),但现在已经不可能了。现在,要在Objective-C中可见,Swift对象必须是符合NSObjectProtocol(最简单的方法是从NSObject继承)的类,或者是标记为@objc枚举,带有一些整数类型的原始值,如Int。您可以使用@objc查看Swift 1.x代码示例的编辑历史记录,无需这些限制

发表评论