Objective c Swift框架嵌套类在Objective C中无法很好地导出
Geography.framework(Swift框架项目)包含以下课程: 在使用此框架的我的swift应用程序中,一切工作都很顺利:Objective c Swift框架嵌套类在Objective C中无法很好地导出,objective-c,swift,frameworks,nested,Objective C,Swift,Frameworks,Nested,Geography.framework(Swift框架项目)包含以下课程: 在使用此框架的我的swift应用程序中,一切工作都很顺利: import geography func setFields() { var contactName:String = Contact.Fields.Name var countryPrefix:String = Country.Fields.Prefix var contactsTable: String = Country.Ta
import geography
func setFields()
{
var contactName:String = Contact.Fields.Name
var countryPrefix:String = Country.Fields.Prefix
var contactsTable: String = Country.Table
}
如果我在Objective中使用相同的Geography.framework,我会看到Contact和Country类,但不会看到嵌套的classes字段。也看不到Contact.Table的值
为了在Objective中具有相同的库结构和库用法,我需要做什么
谢谢,您必须在这里明确ObjC的定义
public class Country: NSObject {
@objc(CountryFields) public class Fields: NSObject {
// ...
}
}
这应该将您的ObjC的Switf的Country.Fields
公开为CountryFields
。我还没有测试过它,但我相信您不必明确从NSObject
继承@objc
属性应该在编译时为您执行此操作
Swift 3的更新:
看起来这是在Swift 3中损坏的,无法修复 您可以对
typealias
使用技巧,使其在使用时具有相同的语法:
public class Contact : NSObject
{
public static let Table: String = "contacts"
typealias Fields = ContactFields
}
@objcMembers
public class ContactFields : NSObject
{
public static let Id: String = "_id"
public static let Name: String = "name"
static let rawId: String = "rawId"
}
public class Country : NSObject
{
typealias Fields = CountryFields
}
@objcMembers
public class CountryFields : NSObject
{
public static let Id: String = "_id"
public static let Prefix: String = "prefix"
static let rawId: String = "rawId"
}
我想你不能,因为objective-C不支持嵌套类。您可能需要用swift编写一个包装器,在objective-C友好的界面中公开这些内容。谢谢。您是否有一些关于如何做到这一点的示例?在Swift 4.2中适用于阅读者,这意味着您可以继续在.Swift代码中使用Contact.Fields的快速命名空间语法,同时在objc代码中使用更类似于obj-c的ContactFields命名,因为obj-c不支持嵌套的Swift类。
public class Contact : NSObject
{
public static let Table: String = "contacts"
typealias Fields = ContactFields
}
@objcMembers
public class ContactFields : NSObject
{
public static let Id: String = "_id"
public static let Name: String = "name"
static let rawId: String = "rawId"
}
public class Country : NSObject
{
typealias Fields = CountryFields
}
@objcMembers
public class CountryFields : NSObject
{
public static let Id: String = "_id"
public static let Prefix: String = "prefix"
static let rawId: String = "rawId"
}