Swift de contenu d'ensemble de la résistance à la compression
L'utilisation de Swift à nouveau, suis-je raté quelque chose?
J'ai cette ligne:
self.itemDescription?.setContentCompressionResistancePriority(UILayoutPriorityRequired, forAxis: UILayoutConstraintAxis.Vertical);
Mais Xcode me donne une erreur:
Undefined symbols for architecture i386: "_UILayoutPriorityRequired"
Un autre de Swift bizarreries?
- Je peux reproduire ce et je serais d'accord que c'est anormal. Je serais probablement juste de soulever un rapport de bug et l'utilisation de 1000 pour l'instant; sans doute quelque chose n'est pas relier contre ce que le module de la définition de symboles (ou ils ne sont pas réellement définie n'importe où...)
- double possible de Étrange exception dans des mises en page
- Ont voté pour fermer cette. Apple n'a pas résolu ce problème encore = /
- ne pas le faire. Cette question googles mieux. Dans OSX swift apps, le même problème existe avec NSLayoutPriorityRequired et la disposition d'autres constantes.
Vous devez vous connecter pour publier un commentaire.
Solution: remplacer
UILayoutPriorityRequired
avec 1000Ce n'est pas un bug. C'est un malentendu de façon Objective-C, les bibliothèques sont importés en Swift. Il faut comprendre comment Swift importations de code (même à partir de l'Apple UIKIt Bibliothèques) de l'Objective-C en Swift.
UILayoutPriority est un float. En Objective-C, un couple de valeurs ont été pré-définis pour nous. La pré-défini les valeurs semblent être un enum. On pourrait s'attendre à ce que la même option serait disponible pour nous en Swift.
La documentation ne semblent impliquer un enum:
SWIFT (Documentation)
OBJECTIVE-C (Documentation)
Mais dans Xcode, si vous demandez à voir la définition de l'une de ces valeurs enum (UILayoutPriorityRequired, par exemple), vous verrez qu'ils sont en fait définis dans le fichier d'en-tête comme des constantes de flotteurs.
OBJECTIVE-C (fichier d'en-Tête)
Ainsi, bien que nous pensons de la mise en page prédéfinis priorités que les valeurs de l'enum (comme le suggère la documentation) la mise en page les priorités ne sont pas vraiment définis comme des énumérations; ils sont définis comme constante de la flotte.
Un soupçon qu'il y a une mis-match-pour quelqu'un qui connaît le langage de programmation C-c'est un enum C ne peut contenir
int
valeurs. La suite est légal et compiler:Mais nous ne pouvons pas définir de flotteurs en tant que valeurs de C enums. Le suivant ne compile pas:
Objective-C enums sont les mêmes que C énumérations (Swift enums sont différents). Il est important de savoir si nous avons affaire à de réels entiers ou des flotteurs. Parce que les nombres entiers peuvent être définies à l'aide de la NS_ENUM macro, qui peut ensuite être importé à Swift comme rapide enum.
L'iBook dit
Extrait De: Apple Inc. “L'utilisation de Swift avec Cocoa et Objective-C.” iBooks
Qui signifie que si UILayoutPriority avait été défini comme un nombre entier à l'aide de la NS_ENUM macro, il aurait été importée en Swift comme Swift enum. C'est le cas pour UILayoutConstraintAxis.
SWIFT (Documentation)
OBJECTIVE-C (Documentation)
Regardant l'Objectif-C fichier d'en-tête confirme ce que dit la documentation.
OBJECTIVE-C (Fichier d'en-Tête)
Donc il y a au moins deux façons de savoir si une valeur prédéfinie que vous êtes habitué à l'aide d'Objective-C est disponible dans Swift:
Il n'y a plus d'une façon de voir si un typedef vous êtes habitué à l'utilisation est d'une constante ou d'une énumération. Dans le code, test pour voir si l'adresse de la constante existe. Les constantes ont une adresse en mémoire, tandis que les énumérations ne sont pas. Voir le code ci-dessous.
Références
UILayoutPriority.Required
ne fonctionne pas, parce que UILayoutPriority n'est pas une Swift enum. Cependant, l'OP est à l'aide deUILayoutPriorityRequired
, qui est définie dans la Swift "en-tête" commelet UILayoutPriorityRequired: UILayoutPriority
. Je pense que la tentative d'utilisation d'une constante définie dans la Swift en-tête résultant en une erreur de l'éditeur de liens est un bug, et pas juste un malentendu.UILayoutPriorityRequired
maintenant avec succès des liens, comme prévu.Une chose à garder à l'esprit est que, même si
UILayoutPriority
est un alias pourFloat
, vous êtes à l'aide de rapide et vous pouvez utiliser une extension pour créer des constantes sémantiques de ces valeurs:Alors vous êtes sur le code peut lire que:
Je l'ai fait moi-même dans un de mes projets et de la pensée, il peut être utile.