[swift] créer un framework
colas_
Membre
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 !
Connectez-vous ou Inscrivez-vous pour répondre.
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é.
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 !
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)
Voilà ce que j'ai essayé de faire :
J'ai un seule classe dans mon framework, dont le code est :
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à :
Et le rendu est semblable à ce que tu vois dans Xcode.
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.
Quelques remarques :
1) quand je commence à tapper "import Test..." : pas d'autocomplétion. Dommage
2) quand je commence à tapper "Pers..." : autocomplétion. cool
3) Si je commande-clique sur Person, rien ne s'affiche. Xcode ouvre une nouvelle fenêtre et mouline.
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
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.
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 deÌ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 !
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 !
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 ?