2015-08-18 8 views
6

ho le seguenti classi contenute da Geography.framework (un progetto quadro Swift):classi del framework annidato Swift non vengono esportati bene in Objective C

public class Contact : NSObject 
{ 
    public static let Table: String = "contacts" 

    public class Fields : NSObject 
    { 
     public static let Id: String = "_id" 
     public static let Name: String = "name" 
     static let rawId: String = "rawId" 
    } 
} 


public class Country : NSObject 
{ 
    public class Fields : NSObject 
    { 
     public static let Id: String = "_id" 
     public static let Prefix: String = "prefix" 
     static let rawId: String = "rawId" 
    } 
} 

Nella mia rapida applicazione utilizzando questo tutto framework funziona senza intoppi:

import geography 

func setFields() 
{ 
    var contactName:String = Contact.Fields.Name 
    var countryPrefix:String = Country.Fields.Prefix 
    var contactsTable: String = Country.Table 
} 

Bene, se uso lo stesso Geography.framework in ObjectiveC, vedo Contact e Country class ma le classi nidificate I campi non sono visibili. Anche il valore di Contact.Table non è visto.

Cosa devo fare per avere la stessa struttura della libreria e l'utilizzo della libreria in ObjectiveC?

Grazie,

+0

Credo che si può non dal Objective-C non supporta le classi nidificate. Probabilmente avrai bisogno di scrivere un wrapper in swift che esponga queste cose in un'interfaccia C-friendly. –

+0

Grazie. Hai qualche esempio su come farlo? – Colateral

risposta

0

Devi essere esplicito qui con la definizione per objC.

public class Country: NSObject { 

    @objc(CountryFields) public class Fields: NSObject { 
     // ... 
    } 
} 

Questo dovrebbe esporre di Country.Fields tuo Switf per il vostro objC come CountryFields. Non l'ho testato ma credo che non sia necessario esplicitare l'ereditarietà da NSObject. L'attributo @objc dovrebbe farlo per te durante la compilazione.

Aggiornamento per Swift 3:

Sembra che questo è stato rotto in Swift 3 e non verrà risolto. https://bugs.swift.org/browse/SR-2267?focusedCommentId=21033&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-21033

0

È possibile utilizzare un trucco con typealias avere la stessa sintassi quando lo si utilizza:

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