2

アプリには、さまざまな構成データを含む PLIST ファイルがあります。一部のデータは、サーバーにアクセスするための URL です。このサーバーは、コードのいくつかの異なるバージョンの JSON ファイルをホストします。私ができるようにしたいのは、バージョンを持つ PLIST ファイルに値を持ち、それを他の値から参照できるようにすることです。したがって、plist の URL 値はhttps://www.company.com/ ${VERSION}/jsonfile.svc のようになります (ここで、${VERSION} は同じ plist ファイルの別のキーです)。

4

2 に答える 2

3

bshirley が述べたように、自動化は何もありませんが、Objective-C がそれを支援します。以下は、これをどのように実装できるかを示す、NSDictionaryという名前のカテゴリの簡単な実装ですVariableExpansion(これは完全にはテストされていませんが、主にこれを自動化する方法を示すのに役立つことに注意してください。また、sexpandedObjectForKeyを扱っていると仮定しているため、NSString少し微調整します。

// In file NSDictionary+VariableExpansion.h
@interface NSDictionary (VariableExpansion)

- (NSString*)expandedObjectForKey:(id)aKey;

@end

// In file NSDictionary+VariableExpansion.m
#import "NSDictionary+VariableExpansion.h"

@implementation NSDictionary (VariableExpansion)

- (NSString*)expandedObjectForKey:(id)aKey
{
    NSString* value = [self objectForKey:aKey];

    NSError *error = NULL;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\$\\{([^\\{\\}]*)\\}"
                  options:NSRegularExpressionCaseInsensitive
                  error:&error];

    __block NSMutableString *mutableValue = [value mutableCopy];
    __block int offset = 0;

    [regex enumerateMatchesInString:value options:0
                  range:NSMakeRange(0, [value length]) usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop)
    {
    NSRange matchRange = [match range];
    matchRange.location += offset;

    NSString* varName = [regex replacementStringForResult:match
                           inString:mutableValue
                             offset:offset
                           template:@"$1"];

    NSString *varValue = [self objectForKey:varName];
    if (varValue)
    {
        [mutableValue replaceCharactersInRange:matchRange
                    withString:varValue];
        // update the offset based on the replacement
        offset += ([varValue length] - matchRange.length);
    }
    }];

    return mutableValue;
}

@end


// To test the code, first import this category:
#import "NSDictionary+VariableExpansion.h"

// Sample NSDictionary.
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
        @"http://${HOST}/${VERSION}/bla", @"URL",
        @"1.0", @"VERSION",
        @"example.com", @"HOST", nil];

// And the new method that expands any variables (if it finds them in the PLIST as well).
NSLog(@"%@", [dict expandedObjectForKey:@"URL"]);

最後のステップの結果はhttp://example.com/1.0/bla、単一の値で複数の変数を使用できることを示しています。変数が見つからない場合、元の文字列では変更されません。

ソースとして PLIST を使用しているため、dictionaryWithContentsOfFileas を使用します

    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:plistPath];
于 2013-04-15T21:08:15.033 に答える