小编典典

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

all

在 Swift 中,如何调用 Objective-C 代码?

Apple 提到它们可以在一个应用程序中共存,但这是否意味着在技术上可以重用在 Objective-C 中创建的旧类,同时在 Swift 中构建新类?


阅读 116

收藏
2022-02-28

共1个答案

小编典典

在 Swift 中使用 Objective-C 类

如果您有想要使用的现有类,请执行 步骤 2 ,然后跳到 步骤 5 。(在某些情况下,我必须在#import <Foundation/Foundation.h旧的 Objective-C 文件中添加一个显式的。)

第 1 步:添加 Objective-C 实现——.m

.m文件添加到您的类,并将其命名为CustomObject.m.

第 2 步:添加桥接头

添加.m文件时,您可能会遇到如下提示:

来自 Xcode 的 macOS 表单样式对话框,询问您是否要“配置 Objective-C
桥接头”

点击

如果您没有看到提示,或者不小心删除了桥接头,.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()
instanceOfCustomObject.someProperty = "Hello World"
print(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()

无需显式导入;这就是桥接头的用途。

在 Objective-C 中使用 Swift 类

第 1 步:创建新的 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)"
    }
}

第 2 步:将 Swift 文件导入到 ObjC 类

SomeRandomClass.m

#import "<#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 someFunctionWithSomeArg:@"Arg"];

NSLog(@"RetString: %@", retString);

笔记:

  1. 如果 Code Completion 未按预期运行,请尝试运行快速构建鈱�``鈬�``R以帮助 Xcode 从 Swift 上下文中找到一些 Objective-C 代码,反之亦然。

  2. 如果您将.swift文件添加到旧项目并收到错误dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib,请尝试完全重新启动 Xcode。

  3. 虽然最初可以NSObject通过使用前缀来使用对 Objective-C 可见的纯 Swift 类(不是 的后代)@objc,但这不再可能。现在,要在 Objective-C 中可见,Swift 对象必须要么是一个符合的类NSObjectProtocol(最简单的方法是继承自NSObject),要么是一个带有某种整数类型的原始值的enum标记,例如. 您可以在没有这些限制的情况下查看 Swift 1.x 代码示例的编辑历史记录。@objc``Int``@objc

2022-02-28