我想用自定义Swift类声明一个Objective-C方法作为它的一个参数,如下所示:
+ (void)doCalculationsWithACustomSwiftClass:(CustomSwiftClass*)swiftObject andAnOrdinaryDictionanary:(NSDictionary*)ordinaryDictionary;
目的是从Swift调用此方法,传递自定义类的实例" CustomSwiftClass.swift"这样Objective-C代码就可以访问它的属性。是否可能,如果可能,我如何声明" CustomSwiftClass"让编译器接受它?
答案 0 :(得分:1)
有几点想法:
要使您的Objective-C代码可以访问Swift类,您必须导入系统生成的标头。正如文档所说:
当您将Swift代码导入Objective-C时,您依靠Xcode生成的头文件将这些文件公开给Objective-C。这个自动生成的文件是一个Objective-C头,它声明了目标中的Swift接口。它可以被认为是Swift代码的伞形头。此标头的名称是您的产品模块名称,然后添加
"-Swift.h"
。 (稍后您将在Naming Your Product Module中详细了解产品模块名称。)
例如,您的Objective-C文件将导入此生成的标头:
#import "MyApp-Swift.h"
有关详细信息,请参阅使用Swift with Cocoa and Objective-C: Mix and Match
如果您没有看到xxx-Swift.h
文件,请仔细检查您的目标设置:
(注意,我搜索" swift"在设置中缩小结果范围。)
正如您所见,以下内容全部设定:
"安装Objective-C兼容性标头"设置为"是";
" Objective-C生成的接口标题名称"设置(并匹配我导入到Objective-C代码中的内容);
" Objective-C Bridging Header"也被指定。
注意,Objective-C桥接头表面上仅仅是为了使Objective-C类可用于Swift代码(并且您当前正试图完成相反的操作),但我注意到这会影响兼容性头文件中也生成了什么代码。因此,请确保您有一个桥接标题。
当然,请确保您的Swift文件包含在编译源列表中:
并确保该类是NSObject
import UIKit
class MyObject: NSObject {
var text: String?
var value: Int = 0
}
注意,一些Swift类型不可用于Objective-C代码。例如,Objective-C不能使用某些可选类型(例如,Int?
等可选类型将不起作用,而String?
的可选类类型将不起作用。因此,如果您正在查看课程,而不是某些属性,请确保它们与Objective-C兼容。
但是我从你的问题中收集到你有更多基本问题,你根本找不到-Swift.h
标题。但是一旦你解决了这个问题,这就是个别财产的考虑因素。