在 Swift 中使用 Obj-C class 扩展?
Using Obj-C class extension in Swift?
我使用 Xcode 的 Add files...
向我的 Swift 项目添加了一些 Obj-C 代码(出色的 Expressions),但它没有询问我如果我想做一个桥接 header。所以我自己在 Obj-C 代码组中创建了一个,将其编辑为 #import
我需要的单个 header,并确保该文件在 Build 的 Swift 编译器中被引用设置。然后我查看了 Obj-C 代码并确保 .m 文件在目标中 - 它们在编译源中。
有问题的 header 包含以下内容:
@interface NSNumber (Expression)
+ (NSNumber *)numberByParsingExpression:(NSString *)expression;
+ (NSNumber *)numberByParsingExpression:(NSString *)expression withVariables:(NSDictionary *)varDictionary;
@end
现在我尝试使用与 :
相同的基本语法来调用此代码
let result = NSNumber.numberByParsingExpression(f.1)
以及主题的几个变体。但它不会编译,"Type 'NSNumber' has no member 'numberByParsingExpression'".
我是不是漏掉了一步?
You can create a bridging header yourself by choosing File > New >
File > (iOS, watchOS, tvOS, or OS X) > Source > Header File.
You’ll need to edit the bridging header file to expose your
Objective-C code to your Swift code.
In your Objective-C bridging header file, import every Objective-C
header you want to expose to Swift. For example:
In Build Settings, in Swift Compiler - Code Generation, make sure the
Objective-C Bridging Header build setting under has a path to the
bridging header file. The path should be relative to your project,
similar to the way your Info.plist path is specified in Build
Settings. In most cases, you should not need to modify this setting.
Any public Objective-C headers listed in this bridging header file
will be visible to Swift. The Objective-C functionality will be
available in any Swift file within that target automatically, without
any import statements. Use your custom Objective-C code with the same
Swift syntax you use with system classes.
如果您已经正确执行此操作,但仍然无法正常工作,请尝试删除项目派生数据,然后清理构建您的项目。
好吧,这原来是一个Xcode小瑕疵。
当您在 组 中创建 header 文件时,它实际上将其物理放置在 源文件夹 中。所以在我的例子中,header 是在 /project/subproject/.h 中创建的,尽管它出现在 Xcode 中是基本文件夹 /project/.h.
的一部分
所以实际上有两个 header,一个在正确的地方,里面什么也没有,另一个在错误的地方,就是在 Xcode 中编辑的那个。所以你必须查看文件检查器以确保它把桥接 header 放在正确的位置!
我使用 Xcode 的 Add files...
向我的 Swift 项目添加了一些 Obj-C 代码(出色的 Expressions),但它没有询问我如果我想做一个桥接 header。所以我自己在 Obj-C 代码组中创建了一个,将其编辑为 #import
我需要的单个 header,并确保该文件在 Build 的 Swift 编译器中被引用设置。然后我查看了 Obj-C 代码并确保 .m 文件在目标中 - 它们在编译源中。
有问题的 header 包含以下内容:
@interface NSNumber (Expression)
+ (NSNumber *)numberByParsingExpression:(NSString *)expression;
+ (NSNumber *)numberByParsingExpression:(NSString *)expression withVariables:(NSDictionary *)varDictionary;
@end
现在我尝试使用与
let result = NSNumber.numberByParsingExpression(f.1)
以及主题的几个变体。但它不会编译,"Type 'NSNumber' has no member 'numberByParsingExpression'".
我是不是漏掉了一步?
You can create a bridging header yourself by choosing File > New > File > (iOS, watchOS, tvOS, or OS X) > Source > Header File.
You’ll need to edit the bridging header file to expose your Objective-C code to your Swift code. In your Objective-C bridging header file, import every Objective-C header you want to expose to Swift. For example:
In Build Settings, in Swift Compiler - Code Generation, make sure the Objective-C Bridging Header build setting under has a path to the bridging header file. The path should be relative to your project, similar to the way your Info.plist path is specified in Build Settings. In most cases, you should not need to modify this setting. Any public Objective-C headers listed in this bridging header file will be visible to Swift. The Objective-C functionality will be available in any Swift file within that target automatically, without any import statements. Use your custom Objective-C code with the same Swift syntax you use with system classes.
如果您已经正确执行此操作,但仍然无法正常工作,请尝试删除项目派生数据,然后清理构建您的项目。
好吧,这原来是一个Xcode小瑕疵。
当您在 组 中创建 header 文件时,它实际上将其物理放置在 源文件夹 中。所以在我的例子中,header 是在 /project/subproject/.h 中创建的,尽管它出现在 Xcode 中是基本文件夹 /project/.h.
的一部分所以实际上有两个 header,一个在正确的地方,里面什么也没有,另一个在错误的地方,就是在 Xcode 中编辑的那个。所以你必须查看文件检查器以确保它把桥接 header 放在正确的位置!