将数据从 Swift 传递到 Objective C 时出现链接器错误

Linker error when passing data from Swift to Objective C

我正在使用 FXForm 库,并希望在 Objective C 文件函数中从我的 Swift 文件中获取数据。

演示项目 Link

Swift 代码实现:

let fontName  = "HelveticaNeue"
let fontSizeLarge:CGFloat = 14.0
var hiddenElementFromFormIndex = [Int]()

//fx form variables
@objc class FXFormVariables : NSObject {
    public override init() {}
    class func FXFontName() -> String { return fontName }
    class func FXFontSize() -> CGFloat { return fontSizeLarge }
    class func FXHiddenCell() -> NSArray { return hiddenElementFromFormIndex as NSArray }
}

在 Objective C 文件中,当我们在下面这样写时出现错误:

NSArray *hideArray = [FXFormVariables FXHiddenCell];

我正确地创建了网桥头文件,并在 Objective C 文件中检查了目标成员资格。

我得到的错误:

 Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$__TtCC13Social_Engine11AppDelegate15FXFormVariables", referenced from:
      objc-class-ref in FXForms.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

架构和有效架构是:

armv7 and armv64

要在 Objective-C 文件中使用 Swift class,您需要导入 Xcode 生成的头文件 在您的 Objective-C 文件.

#import "ProductModuleName-Swift.h"

我创建了一个同名的 Test 项目。

Swift 文件: // // FXFormVariables.swift // 测试 // // 由 Puneet Sharma2 于 2017 年 12 月 7 日创建。 // 版权所有 © 2017 com.puneet.sh2525。版权所有。 //

import Foundation
import UIKit

let fontName  = "HelveticaNeue"
let fontSizeLarge:CGFloat = 14.0
var hiddenElementFromFormIndex = [Int]()

//fx form variables
@objc class FXFormVariables : NSObject {
    public override init() {}
    class func FXFontName() -> String { return fontName }
    class func FXFontSize() -> CGFloat { return fontSizeLarge }
    class func FXHiddenCell() -> NSArray { return hiddenElementFromFormIndex as NSArray }
}

Objective-C 文件

#import "ABC.h"
#import "Test-Swift.h"

@implementation ABC


- (void)drawRect:(CGRect)rect {
    NSArray *hideArray = [FXFormVariables FXHiddenCell];
}

您可以阅读更多相关信息 here

从字面上看,我花了几个小时试图弄清楚为什么我导入到我的 Objc 代码库中的一个 swift 文件会发生这种情况,真正的原因是由于使用了嵌套 class.

如:

@objc public class MyClass {
 @objc public class SecondClass {}
}

如果我尝试在我的 objective-c 代码中使用 SecondClass,我会出现 Apple Mach O-Link 错误。所以解决方案是取消嵌套您要使用的 class。

@objc public class MyClass {}
@objc public class SecondClass {}