2010-06-21 7 views
2

Comment vérifier que NSRegularExpressionSearch existe avant de l'utiliser?Vérifiez si un C en existe

enum { 
    NSCaseInsensitiveSearch = 1, 
    NSLiteralSearch = 2, 
    NSBackwardsSearch = 4, 
    NSAnchoredSearch = 8, 
    NSNumericSearch = 64, 
    NSDiacriticInsensitiveSearch = 128, 
    NSWidthInsensitiveSearch = 256, 
    NSForcedOrderingSearch = 512, 
    NSRegularExpressionSearch = 1024 
}; 

Update- Je veux compiler contre le dernier SDK et vérifier lors de l'exécution si existe NSRegularExpressionSearch.

+2

Le fait que le programme ne compilera pas sans l'aide de définition? –

+0

Pas vraiment :) L'application doit être compatible avec les versions précédentes du système d'exploitation qui n'incluent pas NSRegularExpressionSearch. – christo16

+0

@ christo16: Eh bien, cela n'a aucun sens. Soit le nom est défini (et il compile) ou le nom est indéfini (et il ne compile pas). –

Répondre

2

NSRegularExpressionSearch est seulement lorsque compilé

#if __IPHONE_3_2 <= __IPHONE_OS_VERSION_MAX_ALLOWED 

donc vous devez vérifier que le système d'exploitation actuel est 3.2 ou ultérieure.

if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 3.2) {} 

Dans d'autres cas, vous pouvez vérifier qu'une classe existe ou qu'une instance répond à un sélecteur, mais NSString n'a pas changé autre que ENUM. Par exemple, s'il y avait un ENUM associé à geste de reconnaissance, vous pouvez utiliser une des opérations suivantes:

if (NSClassFromString(@"UIGestureRecognizer") != nil) {} 
if ([someView respondsToSelector:@selector(gestureRecognizers)]) {} 

Pour un autre exemple, voir les modalités de traitement de la macro UI_USER_INTERFACE_IDIOM.

Edit:

Un numéro de version pour vérifier en plus de la version du système est NSFoundationVersionNumber. Ceci est plus étroitement lié à NSString, mais il n'y a aucune constante pour 3.2 dans les en-têtes 3.2.

+0

J'essayais d'éviter de vérifier par la version du système d'exploitation, car c'est généralement une mauvaise pratique. Mais cela ressemble à la seule façon de vérifier. – christo16

1

Le titre de la question est incorrect. Votre question n'est pas de savoir si NSRegularExpressionSearch existe. (Oui, il existe au moment de la compilation avec un SDK> = 3.2.) Votre question est de savoir si des méthodes comme rangeOfString:options: peuvent interpréter correctement le bit d'option pour l'expression régulière à l'exécution.

Puisqu'il s'agit d'une question purement sur le comportement d'une fonction, une façon évidente de le comprendre est de faire une expérience. Faites quelque chose que vous savez réussira quand le support est là mais échouera quand ce n'est pas le cas.

Nous pouvons essayer une correspondance en utilisant une expression régulière qui correspond à une chaîne, mais où la chaîne regex n'existe pas littéralement dans la chaîne, de sorte que si elle ne comprend pas l'option regex, elle fera une correspondance littérale . Par exemple,

if ([@"b" rangeOfString:@"." options:NSRegularExpressionSearch].location != NSNotFound) { 
    // NSRegularExpressionSearch supported 
} 
Questions connexes