Swift Framework n'inclut pas les symboles des extensions aux structures generics

J'ai des problèmes pour lier mon framework avec du code qui tire parti de ce framework. Plus précisément, l'éditeur de liens n'est pas capable de find les symboles des extensions pour les structures generics.

Voici à quoi ressemble l'une des extensions pour Optional:

extension Optional { /// Unwrap the value returning 'defaultValue' if the value is currently nil func or(defaultValue: T) -> T { switch(self) { case .None: return defaultValue case .Some(let value): return value } } } 

Cette méthode fonctionne très bien dans un terrain de jeu ou dans une application si le code est compilé dans la partie principale de l'application. Cependant, lorsque j'essaie de comstackr ceci dans un Framework, les applications (et même les tests pour le framework) produisent l'erreur de lien suivante:

Symboles non définis pour l'architecture i386: "__TFSq2ouU__fGSqQ__FQQ", référencés à partir de: __TFC18SwiftPlusPlusTests27Optional_SwiftPlusPlusTests13testOrWithNilfS0_FT_T_ dans Option + SwiftPlusPlusTests.o

Des methods similaires à celle qui suit, lien bien (remarquez, ce n'est pas sur un générique)

 extension Ssortingng { /// Returns a ssortingng by repeating it 'times' times func repeat(times: Int) -> Ssortingng { var result = "" for i in 0..times { result += self } return result } } 

Il y a deux autres extensions dans mon repository sur github: SwiftPlusPlus qui ne lient pas non plus (les deux sur des structures generics). Vous allez reproduire les erreurs si vous tirez la dernière validation, créez le cadre, puis essayez d'exécuter les tests unitaires.

Jusqu'à présent, j'ai essayé d'exécuter des «strings» sur les files de structure et intermédiaires produits et je ne vois pas les symboles pour ces extensions, mais je vois les symboles pour l'extension de la méthode repeat sur Ssortingng . Donc, il ne semble même pas les comstackr dans la bibliothèque.

Est-ce que quelqu'un sait pourquoi les symboles ne sont pas définis dans le cadre?

modifier

  • Voici un lien vers mon extension facultative
  • Voici un lien vers le file de test qui provoque l'erreur de l'éditeur de liens lors de la compilation de la cible de test

J'ai posté sur les forums Apple Developer et un employé d'Apple a répondu que c'était un bug connu.

Il semble que le compilateur obtient les noms de symbole mutilés des methods dans les extensions generics mal quand ils vivent dans un cadre différent.

Dans le cas où vous cherchez un correctif temporaire, vous pouvez envelopper l'extension dans une méthode de class:

 // In your framework public class OptionalOperator { public class func or<T>(optional:Optional<T>,defaultValue:T) ->T { return optional.or(defaultValue) } } // Outside the framework var maybeText:Ssortingng? let text = OptionalOperator.or(maybeText, defaultValue: "Apple, please fix this") 

Bien sûr, ce n'est pas idéal et va à l'encontre du but des extensions. Donc, si vous prévoyez d'appeler cette méthode fréquemment, nous pourrions surcharger / définir un opérateur .

 // In your framework infix operator 

{} public func

<T>(left:Optional<T>, right:T) -> T { return left.or(right) } // Outside the framework var maybeText:Ssortingng? let text = maybeText

"Apple, please fix this"

Dans mon cas, j'ai plusieurs applications utilisant le framework, donc je voudrais garder l'implémentation de la méthode dans le framework. Cependant, surcharger un opérateur (ou simplement utiliser une fonction globale) serait gênant, donc je dois aller avec la première option jusqu'à ce que ce bug soit corrigé.

J'espère que cela t'aides.

METTRE À JOUR

Chose amusante est que Swift a déjà un opérateur pour ça ( ?? ).

 var maybeText:Ssortingng? let text = maybeText ?? "Nice!" 

C'est ce qu'on appelle – Opérateur de coalescence Nil