Vraag Objectieve C-klassen binnen een op iOS Swift gebaseerd dynamisch framework


Situatie:

Ik heb een iOS-dyanmisch framework geschreven in Swift. Ik heb ook een aantal lessen in Objective C die ik in mijn Swift-lessen zou kunnen gebruiken (sommige zijn openbaar, andere privé). Echter, Ik zou graag de Objective C-klassen willen hebben niet worden blootgesteld aan projecten met behulp van mijn kader.


Wat ik heb geprobeerd:

Paraplu Header

Van wat ik begrijp, zou ik moeten importeren met #import header.h in mijn paraplu header-bestand, dat is meestal FrameworkName.hen zorg er vervolgens voor dat alle header-bestanden van Objective C die ik in mijn Swift-klassen wil opnemen, gemarkeerd zijn als "Openbaar", onder Build-fases -> Headers.

Door dit te doen, wordt het project echter automatisch met behulp van mijn framework blootgesteld aan alle private Objective C-klassen die door het framework worden gebruikt.

Module Mapping (met afzonderlijke module)

Om deze reden heb ik gekeken naar het gebruik van module mapping, dat is gedocumenteerd hier. Ik heb gekeken naar berichten van andere gebruikers, zoals deze en deze, net zoals deze Github repo.

Ik heb met succes het volgende gedaan:

//SharedClasses/module.modulemap
module SharedClasses {
}

//SharedClasses/module.private.modulemap
module SharedClasses.Private {
    header "header.h"
    export *
}

Het probleem is dat in mijn project (dat dit kader heeft geïmporteerd), dit:

import Framework
import Framework.SharedClasses

is toegestaan, en vervolgens worden de "verborgen" Objectief C-klassen blootgelegd. Misschien is dit gewoon hoe modules werken? Is er een manier om ze echt privé te maken?

Module Mapping (met kader private module)

Ik heb ook geprobeerd een module.private.modulemap bestand in de root van mijn framework met de volgende inhoud:

explicit module Framework.Private {
    header "header.h"
    export *
}

en vervolgens de build-instellingen van mijn doel onder MODULEMAP_PRIVATE_FILE linken. Maar als ik dat doe import Framework.Private in de Swift-klassen van mijn framework wordt een compileerfout gegenereerd:

"Geen zo'n module 'Framework.Private'

Ik begrijp niet waarom deze fout optreedt.

Module Mapping (met privé header)

Ik merkte dat in de Clang docs, een private specifier wordt genoemd:

Een header met de private specifier mag niet van buiten de module zelf worden opgenomen.

Ik heb begrepen dat omdat alle Swift-klassen in mijn raamwerk al deel uitmaken van de module Framework, als ik een module.modulemap-bestand maak met het volgende:

framework module Framework {
    umbrella header "Framework.h"

    private header "header.h"

    export *
    module * { export * }
}

dan zou alles moeten werken! De Objective C-headers zijn alleen toegankelijk binnen de module (dat wil zeggen de Swift-klassen van het framework) en worden niet blootgesteld aan een project met behulp van het framework. Cool, maar het werkt niet ... de compiler herkent gewoon de Objective C-klassen niet. Er worden geen andere fouten gegenereerd, maar u kunt de berichtkoppen niet gebruiken, dus het is alsof u de koppen niet in de eerste plaats heeft opgenomen. WAAROM? En wat is de private specifier voor dan?


Soo, mijn oorspronkelijke vraag herhalend:

Is er een manier om Objective C-headers te importeren voor gebruik in Swift-klassen, binnen een dynamisch iOS-framework, terwijl ze privé worden gehouden en niet toegankelijk vanuit elk project dat dit framework gebruikt?

Bedankt voor het lezen en sorry voor het lange bericht. Het was een lange dag (en nacht) ...


15
2018-02-21 12:15


oorsprong


antwoorden:


Je kunt een methode vinden van deze link.

Maak gewoon een map (bijvoorbeeldPrivateA) met module.modulemap waar alle objectkoppen die u in uw Swift-klasse moet gebruiken, zijn opgenomen. bijv.

module $(ModuleName)Private {
    header "header.h"
    export *
}

in Swift, je kunt gebruiken: import $(ModuleName)Private

dus standaardmodule sluit deze headers uit bij gebruik import $(ModuleName).

Van mijn experiment kan een testproject ook import $(ModuleName)Private, maar geen bruikbare code gevonden.

Probeer het hoe dan ook.


2
2018-05-13 10:05