Objective c Swift框架嵌套类在Objective C中无法很好地导出

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

Geography.framework(Swift框架项目)包含以下课程:

在使用此框架的我的swift应用程序中,一切工作都很顺利:

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"
}