Это работает:
NSString *myVar = @"whatever";
NSDecimalNumber *myNum = [NSDecimalNumber decimalNumberWithString:@"10"];
myVar = [myNum stringValue];
Эта версия с изменяемой строкой производит предупреждение "присвоения из отличного типа Objective C":
NSMutableString *myVar = [NSMutableString stringWithString:@"whatever"]; //UPDATE: CORRECTED CODE
NSDecimalNumber *myNum = [NSDecimalNumber decimalNumberWithString:@"10"];
myVar = [myNum stringValue];
В обоих случаях stringValue возвращает NSCFString. Неизменная переменная NSString не заботится, изменяемый NSMutableString жалуется.
P.S. кто-то добавьте теги для NSMutableString и stringValue.
Можно просто вызвать команду из кодового поля:
var parameter = null; // can also be any object you'd like to use as a parameter
this.PreviewReportsCommand.Execute(parameter);
-121--4746448- -stringValue
возвращает автоматически освобожденный экземпляр NSstring, который является неизменяемым объектом. Даже если вы назначите его изменяемому указателю последовательности, он не сделает последовательность изменяемой, и вы не сможете вызвать изменяемые методы последовательности на ней (btw, то же самое остается истинным для вашего 1-го кода):
NSMutableString* tStr = @"lala";
[tStr appendString:@"lalala"]; // CRASH! Attempting to mutate immutable object
Правильным способом его обработки является создание изменяемых последовательностей с помощью метода convinience:
NSMutableString* tStr = [NSMutableString stringWithString:@"lala"];
[tStr appendString:@"lalala"]; // OK
-121--4746562- [myNum StringValue] возвращает значение NSstring, а не NSMuterString, поэтому создается предупреждение.
Если вы попытаетесь манипулировать экземпляром myVar позже (предполагая, что это изменяемая последовательность), вы получите исключение, потому что объект вообще не является изменяемой последовательностью.
Вы не можете сделать неизменяемую строку в смешанную просто, просто назначая его переменной типа NSMutableString *
. То, что вы делаете, по сути, по сути:
NSString *immutableStr = @"Mayonnaise";
NSMutableString *mutableStr = immutableStr;
оба переменные в этом случае указывают на тот же объект постоянного строки (указатели будут сравнивать равную). Вы также получите предупреждение, потому что вы пытаетесь установить переменную типа NSMutableString *
с несовместимым значением типа NSString *
. Это несовместимо, потому что NsmutableString *
обеспечивает методы и поведение NSString *
не так, поэтому, когда вы пытаетесь использовать поведение NsmutableString
, вы получите время выполнения Ошибки, потому что фактический объект, указанный на переменной, не является NsmutableString
.
-stringValue
Возвращает автозависимый экземпляр NSString, который является неизмеренным объектом. Даже если вы назначаете его на мулюдующую строку указателя, он не будет создавать смену строки, и вы не сможете вызвать мулюбируемые методы строки на нем (BTW, то же самое оставайтесь верно для вашего 1-го кода):
NSMutableString* tStr = @"lala";
[tStr appendString:@"lalala"]; // CRASH! Attempting to mutate immutable object
правильный способ Обрабатывать его состоит в том, чтобы создать мулюдующую строку с методом обоищения:
NSMutableString* tStr = [NSMutableString stringWithString:@"lala"];
[tStr appendString:@"lalala"]; // OK