在Swift中,如何调用Objective-C代码?
苹果提到它们可以在一个应用程序中共存,但这是否意味着可以在技术上重用Objective-C中的旧类,同时在Swift中创建新类?
在Swift中,如何调用Objective-C代码?
苹果提到它们可以在一个应用程序中共存,但这是否意味着可以在技术上重用Objective-C中的旧类,同时在Swift中创建新类?
如果您想使用现有的类,请执行Step 2,然后跳到Step 5.(在某些情况下,我必须在旧的Objective-C文件中添加显式
#import <Foundation/Foundation.h
.)
向类中添加一个.m
文件,并将其命名为CustomObject.m
.
添加.m
文件时,可能会出现如下提示:
点击Yes!
如果没有看到提示,或者不小心删除了桥接头,请向项目中添加一个新的.h
文件,并将其命名为<#YourProjectName#>-Bridging-Header.h
.
在某些情况下,尤其是在使用Objective-C框架时,没有显式添加Objective-C类,Xcode找不到链接器.在这种情况下,创建名为上述名称的.h
文件,然后确保在目标的项目设置中链接其路径,如下所示:
Note:
最好的做法是使用$(SRCROOT)
宏链接您的项目,这样,如果您移动了项目,或者使用远程存储库与其他人一起处理项目,它仍然可以工作.$(SRCROOT)
可以被认为是包含您的文件的目录.xcodeproj文件.可能是这样的:
$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h
再添加.h
个文件,并将其命名为CustomObject.h
.
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
YourProject-Bridging-Header.h
年:
#import "CustomObject.h"
SomeSwiftFile.swift
年:
var instanceOfCustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
print(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()
无需明确导入;这就是桥接头的作用.
将.swift
文件添加到项目中,并将其命名为MySwiftObject.swift
.
MySwiftObject.swift
年:
import Foundation
@objc(MySwiftObject)
class MySwiftObject : NSObject {
@objc
var someProperty: AnyObject = "Some Initializer Val" as NSString
init() {}
@objc
func someFunction(someArg: Any) -> NSString {
return "You sent me \(someArg)"
}
}
SomeRandomClass.m
年:
#import "<#YourProjectName#>-Swift.h"
文件:<#YourProjectName#>-Swift.h
应该已经在您的项目中自动创建,即使您看不到它.
MySwiftObject * myOb = [MySwiftObject new];
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
myOb.someProperty = @"Hello World";
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
NSString * retString = [myOb someFunctionWithSomeArg:@"Arg"];
NSLog(@"RetString: %@", retString);
如果代码完成没有达到预期效果,请try 使用⌘⇧R帮助Xcode从Swift上下文中找到一些Objective-C代码,反之亦然.
如果将.swift
文件添加到较旧的项目中,并出现错误dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
,请try 完全restarting Xcode.
虽然最初可以使用纯Swift类(而不是NSObject
的后代),通过使用@objc
前缀,Objective-C可以看到这些类,但现在已经不可能了.现在,要在Objective-C中可见,Swift对象必须是符合NSObjectProtocol
的类(最简单的方法是从NSObject
继承),或者是标记为@objc
的enum
,带有某个整数类型的原始值,如Int
.You may view the edit history for an example of Swift 1.x code using @objc
without these restrictions.