1

NSScanner は NSString へのポインターを受け取ります。

NSMutableString *myString;
...
[scanner scanUpToCharactersFromSet:charSet intoString:&myString];
[myString appendString:@"hello"];

しかし、myString は変更可能であるため、後で追加しようとすると、変更不可能なものを変更しようとしているというエラーが表示されます。一時コピーを作成して前後に移動する必要がありますか、またはこれを行うためのより効率的な方法はありますか?

4

2 に答える 2

3

どちらか

NSString *myString; //this is just a variable identifier, no object was created and assigned to it yet
...
//scanner will create a NSString and write it to myString. It won't know it is passed to a variable typed NSMutableString or NSString
[scanner scanUpToCharactersFromSet:charSet intoString:&myString];

//instead of creating mutable string you can create a new immutable by appending a string
myString = [myString stringByAppendingString:@"hello"];

以上: 次のコード スニペットを参照してください

NSMutableString *myString; //this is just a variable identifier, no object was created and assigned to it yet
...

//scanner will create a NSString and write it to myString. It won't know it is passed to a variable typed NSMutableString
[scanner scanUpToCharactersFromSet:charSet intoString:&myString];
//myString contains a NSString now, not NSMutableString

myString = [myString mutableCopy]; // make a mutable copy and assign it to the variable
[myString appendString:@"hello"];

2 番目のアプローチでは、NSMutable 型付き変数がしばらくの間、不変の文字列を保持するという矛盾が生じます。これは間違いなく欠陥です。解決策 1 は、はるかにクリーンです。2 つを優先する場合は、2 つ目の NSString 変数を導入し、それをスキャナーに渡し、その可変コピーを NSMutableString に渡す必要があります。

NSString *tempString;
NSMutableString *myString; 
...

[scanner scanUpToCharactersFromSet:charSet intoString:&tempString];

myString = [tempString mutableCopy];
[myString appendString:@"hello"];
于 2013-02-09T15:37:49.933 に答える
1

In case you need to repeat that multiple times, do it with only one mutable string:

NSMutableString *mutableString = [NSMutableString string];
NSString *string = nil;

[scanner scanUpToCharactersFromSet:charSet1 intoString:&string];
[mutableString appendString:string];

[scanner scanUpToCharactersFromSet:charSet2 intoString:&string];
[mutableString appendString:string];

//...

No need to copy them or do any other conversion.

于 2013-02-09T15:49:48.240 に答える