1

これが可能かどうかはわかりませんが、正規表現やその他のツールを使って人々がクレイジーなことをしているのを見てきました。

このplistをObjective-Cリテラルに変換したいと思います。

<dict>
    <key>ar</key>
    <array>
        <string>+54## #### ####</string>
        <string>## #### ####</string>
    </array>
    <key>at</key>
    <array>
        <string>+43 1 ########</string>
        <string>+43 ############</string>

</dict>

に変換:

NSDictionary *dic = @{ 
     @"ar" : @[@"+54## #### ####", @"## #### ####"],
     @"at" : @[@"+43 1 ########",@"+43 ############"]
};

そのような変換を自動化することは可能ですか?この男は似たようなことをしました。彼はVIMを使用してPHPリストをNSDictionaryに解析しました。

4

2 に答える 2

8

Plistには、コードで使用するための個別の「形式」がありません(この質問はそのままでは意味がありません)。1.これらの値で辞書を初期化するObjective-Cコードを生成するか、2。ファイルを使用して辞書を初期化します。

NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:@"UIPhoneFormats.plist"];

編集:つまり、同じ辞書を再現するObjective-Cコードを生成する必要があります。このためには、辞書の内容をフォーマットされた方法で再印刷する必要があります。次のようなプログラムを作成できます。

#import <stdio.h>
#import <Foundation/Foundation.h>

NSString *recursiveDump(id object)
{
    if ([object isKindOfClass:[NSString class]]) {
        return [NSString stringWithFormat:@"@\"%@\"", object];
    } else if ([object isKindOfClass:[NSNumber class]]) {
        return [NSString stringWithFormat:@"@%@", object];
    } else if ([object isKindOfClass:[NSArray class]]) {
        NSMutableString *str = [NSMutableString stringWithString:@"@["];
        NSInteger size = [object count];
        NSInteger i;
        for (i = 0; i < size; i++) {
            if (i > 0) [str appendString:@", "];
            [str appendString:recursiveDump([object objectAtIndex:i])];
        }
        [str appendString:@"]"];
        return str;
    } else if ([object isKindOfClass:[NSDictionary class]]) {
        NSMutableString *str = [NSMutableString stringWithString:@"@{"];
        NSString *key;
        NSInteger size = [object count];
        NSArray *keys = [object allKeys];
        NSInteger i;
        for (i = 0; i < size; i++) {
            if (i > 0) [str appendString:@", "];
            key = [keys objectAtIndex:i];
            [str appendFormat:@"%@: %@", recursiveDump(key), recursiveDump([object objectForKey:key])];
        }
        [str appendString:@"}"];
        return str;
    } else {
        // feel free to implement handling NSData and NSDate here,
        // it's not that straighforward as it is for basic data types.
    }
}


int main(int argc, char *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:@"UIPhoneFormats.plist"];
    NSMutableString *code = [NSMutableString stringWithString:@"NSDictionary *dict = "];
    [code appendString:recursiveDump(dict)];
    [code appendString:@";"];
    printf("%s\n", [code UTF8String]);

    [pool release];
    return 0;
}

このプログラムは、提供されたプロパティリストからObjective-C初期化コードを生成します(構文エラーがないことを願っています)。これは、プロジェクトにコピーして貼り付けて使用できます。

編集: OPが提供したplistファイルのストリップバージョンでプログラムを実行すると(元のファイルが大きすぎるため、少しカットしました)、次のコードが生成されました。

NSDictionary *dict = @{@"at": @[@"+43 1 ########", @"+43 ############", @"01 ########", @"00 $"], @"ar": @[@"+54## #### ####", @"## #### ####", @"00 $", @"18 ### $ "]};

それが本当に有効であることを確認するためにint main()、これを「test.m」というファイルの途中に貼り付けたので、次のプログラムを入手しました。

#import <Foundation/Foundation.h>

int main()
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSDictionary *dict = @{@"at": @[@"+43 1 ########", @"+43 ############", @"0$
    NSLog(@"%@", dict);

    [pool release];
    return 0;
}

確認するために、私は走っclang -o test test.m -lobjc -framework Foundationて驚き、驚きます:

機能した。

編集2:これをコマンドラインユーティリティにしました。これは、今後の作業を容易にするためです。これは将来役立つ可能性があります。Plist2ObjC

お役に立てれば。

于 2012-10-24T18:18:43.087 に答える
0

必要なのはプロパティリストのシリアル化です

NSData* plistData = [source dataUsingEncoding:NSUTF8StringEncoding];
NSString *error;
NSPropertyListFormat format;
NSDictionary* plist = [NSPropertyListSerialization propertyListFromData:plistData mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&error];
NSLog( @"plist is %@", plist );
if(!plist){
        NSLog(@"Error: %@",error);
        [error release];
}

文字列として取得したい場合は、これを使用してください。

NSString *aString = [NSString stringWithFormat:@"%@", plist];

またはNSString *aString = [plist description]、文字列と同じものを取得するために呼び出すことができます。

ソース

于 2012-10-24T18:17:36.523 に答える