将数据从 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 {}
我正在使用 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 {}