[swift] créer un framework

Hello !


 


Je me demandais : comment fait-on lorsqu'on crée un framework avec swift pour n'exposer que certaines méthodes ? En objective-C, c'est facile avec le .h mais en swift ? J'ai essayé de préfixer certaines méthodes en private tout en mettant la classe MyClass.swift dans les headers disponibles du framework, mais ça ne marche pas.


 


Merci !


Réponses

  • Je comprends pas trop ta question.


    Tu veux interfacer un framework Swift avec Objective-C?


    Quant au .h il ne faut pas le toucher, il est auto-ginéré.


  • AliGatorAliGator Membre, Modérateur
    septembre 2015 modifié #3

    en mettant la classe MyClass.swift dans les headers disponibles du framework

    Comment ça "en mettant la classe Swift dans les headers du framework ??!?

    Comme dit Pyroh il ne faut pas toucher aux .h générés par Xcode à  partir de ton code Swift car ils sont auto-générés " ça ne changerait rien de les modifier c'est regénéré (donc réecrasé) à  la compilation !


    J'ai essayé de préfixer certaines méthodes en private

    Heu justement, si tu mets "private" elles ne seront même pas visible aux autres classes du module, juste privées à  la classe dans laquelle tu les déclarés et inaccessibles à  l'extérieur donc justement l'inverse (le terme "privé" est pourtant plutôt clair)


    Si tu mets rien par défaut les méthodes sont "internal" donc ne seront pas exposées à  l'extérieur du module (du framework). Et évidemment si tu mets "internal" explicitement c'est pareil.


    Pour qu'elles soient visibles de l'extérieur du framework il faut juste mettre "public" pour qu'elles soient... publiques (et donc accessibles à  tout le monde)
  • Ok. Je n'avais mis aucun préfixe public. Je réessaierais. Merci !
  • Voilà  ce que j'ai essayé de faire :


     


    J'ai un seule classe dans mon framework, dont le code est :



    public class Person {

    public init()
    {
    name = ""
    nickname = ""
    }

    public var name : String
    private var nickname : String

    }

    Quand je compile le framework, je n'ai aucune trace de la classe Person (si je regarde dans le dossier headers du framework).


    Cependant, ça marche bien comme on s'y attend : si j'import le framework, je peux bien utiliser la classe Person et la property name mais pas nickname.


     


     


    Ma question est : comment l'utilisateur peut-il avoir accès à  l'interface de Person, ie qu'il sache quelles méthodes sont dispos, etc ?

  • Il faut simplement mettre des commentaires avant les propriétés/fonctions.


    Si tu veux avoir une liste ou un truc redistribue, là  il faut générer une doc... (NSHipster en cause)


     


    Tu peux te calquer sur la doc de Swift. Moi je fais un truc dans ce genre là  :



    /// Remove `n` first elements on top of the stack.
    ///
    /// **Precondition**: `n <= self.count`
    public mutating func pop(n: Int) {
    guard n <= count else { fatalError("Stack doesn't contain such amount of elements") }
    ensureUnique()
    storage.removeLast(n)
    storage.adaptCapacity()
    }

    Et le rendu est semblable à  ce que tu vois dans Xcode.


  • AliGatorAliGator Membre, Modérateur

    Il faut simplement mettre des commentaires avant les propriétés/fonctions.
    Si tu veux avoir une liste ou un truc redistribue, là  il faut générer une doc... (NSHipster en cause)

    L'article de NSHipster n'est plus à  jour, car Xcode 7 a changé le format de la documentation Swift.

    Mais de toute façon même si c'est en effet une bonne chose de commenter son API pour qu'elle soit documentée correctement, je ne pense pas que ça réponde à  la question de Colas, puisqu'il ne semble pas avoir l'interface Swift de sa classe Person exportée ? (Colas, si tu fais un Commande-Clic sur Person dans ton projet app, il ne t'affiche pas l'interface générée de l'API Swift de ta classe ?)
  • Bon à  savoir ça ! Merci du tuyau.


  • colas_colas_ Membre
    septembre 2015 modifié #9

    Quelques remarques :


     


    1) quand je commence à  tapper "import Test..." : pas d'autocomplétion. Dommage :(


     


    2) quand je commence à  tapper "Pers..." : autocomplétion. cool :)


     




    Colas, si tu fais un Commande-Clic sur Person dans ton projet app, il ne t'affiche pas l'interface générée de l'API Swift de ta classe ?




     


    3) Si je commande-clique sur Person, rien ne s'affiche. Xcode ouvre une nouvelle fenêtre et mouline.


     

    4) En revanche, quand je commence à  tapper "name..." : autocomplétion et j'ai la doc de `name` qui s'affiche.

     

    Est-il possible sinon de générer des .h automatiquement et de les ajouter dans les "public headers" du framework ?


  • Mais tu fais du Swift...


    J'ai du mal à  comprendre cette fixation sur les .h qui n'ont plus rien a voir avec Swift.


  • Il désire peut-être un framework utilisable avec les deux langages ?

  • Xcode le fait automatiquement alors...


  • @Pyroh,


     


    Ma question c'est :


    Comment fait l'utilisateur de mon package pour savoir quelle sont les classes et les méthodes disponibles ?


  • En lisant la doc, non ?


  • OK. Je crois que je regrette la disparition des .h


  • AliGatorAliGator Membre, Modérateur

    @Pyroh,
     
    Ma question c'est :
    Comment fait l'utilisateur de mon package pour savoir quelle sont les classes et les méthodes disponibles ?

    En regardant le fichier d'interface Swift automatiquement généré par Xcode. Que tu n'as pas à  inclure dans ton framework ou quoi, puisque l'API publique est automatiquement régénérée et donc visible quand ton utilisateur récupères le framework.

    Donc non, pas besoin de "mettre le .h dans le framework" puisque tu n'as plus à  écrire ce .h toi-même et que Xcode le génère *à  la volée* quand l'utilisateur demande de voir l'API du module Swift. C'est tout l'intérêt d'ailleurs.
  • AliGatorAliGator Membre, Modérateur

    En lisant la doc, non ?

    Non, la doc c'est pour savoir ce que font chaque méthode. C'est nécessaire (tout bon framework se doit d'être correctement documenté), mais ce n'est pas la question de Colas, qui ne semble juste pas réussir à  voir l'interface auto-générée de son code Swift dans son Xcode (alors que c'est ça qu'il veut, que son utilisateur puisse voir la liste des méthodes publiques que le framework expose)

    Normalement, par exemple si tu écris "import MonFramework" puis que tu fais un Commande-Clic sur le mot "Monframework" de cette ligne, Xcode devrait te montrer l'interface publique auto-générée de ton framework Swift.
  • Je récapitule ce que j'ai fait :


     


    1) je crée un framework. cf. https://github.com/colasjojo/Test-Library-swift


    (en gros, je n'ai touché à  aucun setting ; j'ai juste créé une classe avec une méthode private et une publique ; j'ai choisi "Cocoa Touch framework", par opposition au static framework)


    2) j'ai compilé (en mode DEBUG) puis je suis allé chercher le .framework dans DerivedData


    3) je glisse-dépose le .framework dans un autre projet


     


    Je peux alors utiliser classes et méthodes publiques. Mais quand je commande-cliques sur "TestLibrary" une fenêtre s'ouvre mais rien ne s'affiche, j'ai juste une roue qui mouline.


  • Pour ma part, comme mes frameworks évoluent en même temps que le projet qui les utilise, je drag & drop le projet au lieu du framework compilé. Et chez moi ça marcheâ„¢


     


    Essaie de faire comme ça, histoire de vérifier que ça n'est pas un vilain bug.


    Il me semble avoir lu un truc au début de Swift comme quoi on pouvait pas utiliser de framework compilé mais j'ai oublié les détails... Mais si y'a vraiment une enroule du genre Ali saura surement. 


  • En même temps, si tu drag & drop tout le projet, tu drag & drop aussi les classes non compilées !


     


    Sinon, j'ai essayé ta méthode (qui de toute façon ne correspond à  ce que je veux faire), mais ça ne marche pas. J'ai créé un workspace (première fois que je fais ça), j'y ai drag & drop le projet qui utilise le framework et le projet qui crée le framework. Dans ce cas, ça ne marche même plus !


  • AliGatorAliGator Membre, Modérateur

    Mais quand je commande-cliques sur "TestLibrary" une fenêtre s'ouvre mais rien ne s'affiche, j'ai juste une roue qui mouline.

    pour moi, tu as fait tout comme il fallait. Si tu as une roue qui mouline c'est un bug de Xcode qui n'aurait pas indexé ( ou n'aurait pas fini d'indexer) ce qu'il fallait
  • colas_colas_ Membre
    septembre 2015 modifié #22

    En fait, si j'essaie de compiler mon projet (ce que je n'avais pas encore fait), j'ai l'erreur :


     


    dyld: Library not loaded: @rpath/TestLibrary.framework/TestLibrary


      Referenced from: /Users/colas/Library/Developer/CoreSimulator/Devices/AEC1D1D3-A9AA-4CAF-901D-5F821E321A39/data/Containers/Bundle/Application/12E1EE66-1745-4CD2-AF93-7E4759F51FA4/Test Library.app/Test Library


      Reason: image not found


     


     


    (Xcode 6.4)


  • T'as téléchargé ton Xcode chez Baidu ?

  • Non, c'est Jon Snow qui me l'a filé sur clé USB !


  • DrakenDraken Membre
    septembre 2015 modifié #25

    Alors ton Xcode est sain. A moins que .. ton Mac est-il plus froid que d'habitude ? T'as un cutter à  lame d'obsidienne chez toi ?

Connectez-vous ou Inscrivez-vous pour répondre.