簡體   English   中英

Objective-C,將變量值分配給 plist 字符串

[英]Objective-C, Assign variable value to plist string

我有一個這樣的.plist文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>key1</key>
    <string>variable1</string>
    <key>key2</key>
    <array>
        <string>foobar</string>
        <string>variable2</string>
    </array>
</dict>
</plist>

我的代碼如下所示:

NSString *variable1 = @"Hello";
NSString *variable2 = @"World!";

NSMutableDictionary *myDict = [NSMutableDictionary dictionaryWithContentsOfFile:@"/path/to/file.plist"];

NSLog(@"key1: %@", [myDict valueForKey:@"key1"]);
NSLog(@"key2: %@", [[myDict valueForKey:@"key2"] objectAtIndex:1]);

// outputs
// key1: variable1
// key2: variable2

我希望做的是讓.plist文件中的variable1variable2使用代碼中的variable1variable2 (沒有在代碼中專門這樣做),因此.plist中的值最終成為variable1 1 和World!Hello World! 對於variable2

顯然,像這樣分配它們是可能的:

[myDict setObject:variable1 forKey:@"key1"];

這正是我想要避免的 顯然,“變量”只是.plist中的字符串,而 obj-c 並不認為將代碼中的變量值分配給它們。 所以問題是我可以為它們分配代碼中的值(如<variable>variable1</variable> ),還是不讓它們成為字符串? 或者也許這是不可能的。

注意:我不是程序員,所以請記住這一點,謝謝。

所以問題是我可以為它們分配代碼中的值(如變量1),還是不讓它們成為字符串?

方法很多,但是...

注意:我不是程序員,所以請記住這一點,謝謝。

這帶來了明顯的挑戰,我們不知道您實際知道多少,您沒有嘗試進行實際替換。 等:但是你確實做了一個很好的觀察:

顯然,“變量”只是 .plist 中的字符串,而 obj-c 並不認為將代碼中的變量值分配給它們。

許多初學者,還有一些不是,混淆了用作變量名稱的字符序列variable1和用作字符串的相同序列之間的區別——你正確地識別出它們是不同的東西。

讓我們看看我們是否可以在不上冗長的程序設計課程的情況下幫助您。 首先,我們將堅持使用 plist 作為您的字典(稍后給出您對<variable>variable1</variable>的建議,您可能希望考慮使用您自己的 XML)。

其次,我們將假設當“變量”用作字典中的值時,它將始終是整個值而不是它的一部分,例如,您永遠不會有像<key>key1</key> <string>The value of the variable is: variable1</string>這樣的東西<key>key1</key> <string>The value of the variable is: variable1</string>並且期望variable1被替換。

我們首先修改您的代碼以從應用程序包中讀取 plist,並使用現代 Objective-C 語法來查找字典和數組值:

NSURL *sampleURL = [NSBundle.mainBundle URLForResource:@"sampleDictionary" withExtension:@"plist"];
NSMutableDictionary *myDict = [NSMutableDictionary dictionaryWithContentsOfURL:sampleURL];

NSLog(@"key1: %@", myDict[@"key1"]);    // dictionary lookup
NSLog(@"key2: %@", myDict[@"key2"][1]); // dictionary + array lookup

文件sampleDicitonary.plist已添加到 add 並包含您的 plist。 這輸出:

key1: variable1
key2: variable2

就像你的代碼一樣。

現在,您可以使用字典,其中鍵是變量名,而不是聲明兩個變量variable1variable2

NSDictionary *variables = @{ @"variable1": @"Hello",
                             @"variable2": @"World!"
                           };

這代表了與您的兩個不同變量相同的信息,但至關重要的是變量名稱只是字符串,並且正如您已經觀察到的那樣,您的 plist 包含字符串——所以現在我們遇到了字符串替換而不是變量替換的問題。 要進行字符串替換,我們使用:

  • 字典中的鍵查找,例如上面的myDict[@"key1"] ,如果字典中不存在該鍵,則返回nil
  • 表達式<expr1>?: <expr2> > 如果值不是nil ,則計算為<expr1>的值,其他則計算為<expr2> (這是條件表達式的縮寫——你可以查一下。)

因此,如果我們將索引到您的 plist 的結果分配給變量:

NSString *rawKeyValue = myDict[@"key1"];

然后在我們的variables字典中查找該值:

NSString *substitutedValue = variables[rawKeyValue];

然后,如果rawKeyValue的值是您的“變量”( variable1variable2 )的名稱之一,那么substitutedValue將是相應的值( HelloWorld! )。 如果rawKeyValue不是變量名,那么substitutedValue的值將為nil ...

但是在第二種情況下你不想要nil ,你想要rawKeyValue的值,你可以通過使用?:運算符來獲得它,它可以替換第一個NSLog()

NSString *rawKeyValue = myDict[@"key1"];
NSString *substitutedValue = variables[rawKeyValue] ?? rawKeyValue;
NSLog(@"key1: %@", substitutedValue);

這將是 output:

key1: Hello

為每次查找執行這些額外的步驟是重復且乏味的,編程有一個解決方案:定義一個方法來封裝它並避免使用中間變量。 這是一種可能的方法:

- (NSString *)substitute:(NSDictionary *)variables in:(NSString *)value
{
   return variables[value] ?: value;
}

並且有了這個定義,第一個NSLog變為:

NSLog(@"key1: %@", [self substitute:variables in:myDict[@"key1"]]);

希望對您有所幫助並幫助您入門。 但是,如果您要編寫程序,請務必花時間正確學習編程!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM