在 Swift 中,如何调用 Objective-C 代码?
Apple 提到它们可以在一个应用程序中共存,但这是否意味着在技术上可以重用在 Objective-C 中创建的旧类,同时在 Swift 中构建新类?
如果您有想要使用的现有类,请执行 步骤 2 ,然后跳到 步骤 5 。(在某些情况下,我必须在#import <Foundation/Foundation.h旧的 Objective-C 文件中添加一个显式的。)
#import <Foundation/Foundation.h
将.m文件添加到您的类,并将其命名为CustomObject.m.
.m
CustomObject.m
添加.m文件时,您可能会遇到如下提示:
点击 是 !
如果您没有看到提示,或者不小心删除了桥接头,.h请在项目中添加一个新文件并将其命名为<#YourProjectName#>-Bridging- Header.h.
.h
<#YourProjectName#>-Bridging- Header.h
在某些情况下,特别是在使用 Objective-C 框架时,您没有显式添加 Objective-C 类,Xcode 找不到链接器。在这种情况下,创建.h如上所述命名的文件,然后确保在目标的项目设置中链接其路径,如下所示:
笔记:
最佳做法是使用$(SRCROOT)宏链接您的项目,这样如果您移动项目,或使用远程存储库与其他人一起处理项目,它仍然可以工作。$(SRCROOT)可以认为是包含您的 .xcodeproj 文件的目录。它可能看起来像这样:
$(SRCROOT)
$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h
添加另一个.h文件并将其命名为CustomObject.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:
YourProject-Bridging-Header.h
#import "CustomObject.h"
在SomeSwiftFile.swift:
SomeSwiftFile.swift
var instanceOfCustomObject = CustomObject() instanceOfCustomObject.someProperty = "Hello World" print(instanceOfCustomObject.someProperty) instanceOfCustomObject.someMethod()
无需显式导入;这就是桥接头的用途。
将.swift文件添加到您的项目中,并将其命名为MySwiftObject.swift.
.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:
SomeRandomClass.m
#import "<#YourProjectName#>-Swift.h"
该文件:<#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);
如果 Code Completion 未按预期运行,请尝试运行快速构建鈱�``鈬�``R以帮助 Xcode 从 Swift 上下文中找到一些 Objective-C 代码,反之亦然。
鈱�``鈬�``R
如果您将.swift文件添加到旧项目并收到错误dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib,请尝试完全重新启动 Xcode。
dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
虽然最初可以NSObject通过使用前缀来使用对 Objective-C 可见的纯 Swift 类(不是 的后代)@objc,但这不再可能。现在,要在 Objective-C 中可见,Swift 对象必须要么是一个符合的类NSObjectProtocol(最简单的方法是继承自NSObject),要么是一个带有某种整数类型的原始值的enum标记,例如. 您可以在没有这些限制的情况下查看 Swift 1.x 代码示例的编辑历史记录。@objc``Int``@objc
NSObject
@objc
NSObjectProtocol
enum
@objc``Int``@objc