【问题标题】:Substituting environment variables into NSString将环境变量替换为 NSString
【发布时间】:2014-06-17 21:14:24
【问题描述】:

我正在尝试将环境变量替换为字符串,但被regularExpresionWithPattern 阻止。

我在另一个问题上找到了一些代码,似乎可以回答其他人的问题,但无论出于何种原因,对我都不起作用:

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.

虽然代码预计也适用于 10.7 SDK,但我正在针对 OS 10.8 SDK 构建。

我检查了文档,确实,文档中不存在此方法。然而不知何故,它对其他人有用,我不太明白为什么。

【问题讨论】:

    标签: cocoa nsstring nsregularexpression


    【解决方案1】:

    如果有人成功使用了一个方法,但它不在 SDK 中,那么他们一定是添加了一个类别。我注意到另一个问题具有该确切方法的实现:Is this a sane Objective-C Block Implementation?

    【讨论】:

    • orz 所以它毕竟是一种自定义方法。我并不特别希望这个代码库膨胀,所以我可能会直接内联它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 2018-09-09
    • 2016-06-05
    相关资源
    最近更新 更多