2014-05-01 9 views
0

Я пытаюсь заменить переменные среды на строку, но застопорился regularExpresionWithPattern.Подстановка переменных среды в NSString

Я нашел код на другой вопрос, который, казалось, ответ чужой вопрос, но по какой-либо причине, не работает для меня:

NSString *substituteVariables(NSString *input) { 
    NSDictionary *environment = [[NSProcessInfo processInfo] environment]; 

    NSError *error = nil; 
    // I know this pattern isn't good enough, but it's a start! 
    NSRegularExpression *regex = [NSRegularExpression 
     regularExpressionWithPattern:@"$([A-Z_]+)" 
     options:NSRegularExpressionCaseInsensitive error:&error]; 
    return [regex stringByReplacingMatchesInString:input options:0 
        range:NSMakeRange(0, input.length) 
        usingBlock:^NSString *(NSTextCheckingResult *result, 
             NSMatchingFlags flags, BOOL *stop) { 
     NSString *envKey = [input substringWithRange:[result rangeAtIndex:1]]; 
     return [environment objectForKey:envKey]; 
    }]; 
}; 

Это генерирует предупреждение компилятора, который в значительной степени предполагает, что код выиграл «т работы:

appbundler/native/main.m:64:19: warning: instance method '-stringByReplacingMatchesInString:options:range:usingBlock:' not found (return type defaults to 'id') [-Wobjc-method-access] 
    return [regex stringByReplacingMatchesInString:input options:0 range:NSMakeRange(0, input.length) usingBlock:^NSString *(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { 
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSRegularExpression.h:25:12: note: receiver is instance of class declared here 
@interface NSRegularExpression : NSObject <NSCopying, NSCoding> { 
     ^
1 warning generated. 

Я строю против OS 10.8 SDK, хотя код должен работать против 10,7 SDK, а также.

Я проверил документы и, действительно, этот метод не существует в документах. Но почему-то это сработало для кого-то другого, и я не могу понять, почему.

ответ

1

Если кто-то использует метод успешно, но его нет в SDK, они должны добавить его с категорией. Я замечаю, что этот другой вопрос имеет реализацию этого точного метода: Is this a sane Objective-C Block Implementation?

+0

orz, так что это был нестандартный метод. Я не особо хочу, чтобы эта кодовая база раздувалась, поэтому я, вероятно, просто включу это. – Trejkaz

Смежные вопросы