Заключительное слово на NSStrings: Изменяемый и Неизменный

если вы действительно хотите «запретить» пользователю вводить пробелы

, вы можете реализовать следующий метод в UITextFieldDelegate

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range     replacementString:(NSString *)string { 

    NSString *resultingString = [textField.text stringByReplacingCharactersInRange: range withString: string];
    NSCharacterSet *whitespaceSet = [NSCharacterSet whitespaceCharacterSet];
    if  ([resultingString rangeOfCharacterFromSet:whitespaceSet].location == NSNotFound)      {
        return YES;
    }  else  {
        return NO;
    }
 }

Если пользователь вводит пробел в поле, нет изменить в текущем тексте

8
задан Donna 25 May 2009 в 05:02
поделиться

4 ответа

Ответ - нет. Неизменяемость означает, что ее нельзя изменить на что-либо , отличное от исходной строки. Каждый символ остается неизменным, длина не может измениться и т. Д. Как только он определен, вы не можете ничего изменить в этой строке. Если вы хотите сделать его длиннее или короче или изменить какой-либо из символов, вам нужно создать новую строку (или использовать для начала NSMutableString).

20
ответ дан 5 December 2019 в 04:52
поделиться

Вам также необходимо определить "изменение" :)

По сути, когда вы создаете NSString, вы создаете массив символов и сообщаете компилятору, что содержимое указанного массива никогда не изменится. Часть «никогда не менять» является «неизменной» частью; данные, содержащиеся в строке, никогда не могут быть изменены.

С другой стороны, NSMutableString позволяет вам фактически изменять данные, на которые она указывает (следовательно, она «изменяема»). Обратите внимание на метод appendString, который существует для NSMutableString; это фактически берет данные и помещает их в конец строки.

Например, если у вас есть:

NSString * myString = @ "Cat"; myString = @ "Goldfish";

Это подойдет. Фактически вы никогда не изменяете данные, которые содержит myString; вы просто говорите ему, что хотите, чтобы он указывал на новый сегмент неизменяемых данных.

Единственный раз, когда вы действительно столкнетесь с проблемами, связанными с различиями между изменяемыми и неизменяемыми объектами, - это если вы попытаетесь напрямую изменить myString (например, добавьте к нему «s are cool» или что-то в этом роде.)

Другими словами, любой класс позволит вам «заменить» любую строку на любую другую, но методы, которые вы использовали для этого, будут сильно отличаться. Например, чтобы превратить «cat» в «CAT» с изменяемой строкой, вы можете перебрать каждый символ и просто сделать его прописным (поскольку вы можете изменить содержимое изменяемой строки). С другой стороны, с неизменяемой строкой http://www.kirupa.com/forum/showthread.php?t=307928 http://forums.macrumors.com/showthread.php?t=467099

Я также рекомендую погуглил; это вопрос, который относится к развитию в целом, и это относительно важная концепция, которую нужно понять. Это также до смерти обсуждалось в другом месте в Интернете.

2
ответ дан 5 December 2019 в 04:52
поделиться

Если я объявлю переменную:

NSString * var;
// Here some code giving a new value to var

Неизменяемым является объект, на который указывает var , а не сам var .

Это означает, что я не могу ничего изменить в объекте, на который указывает var , но я могу изменить, на какой объект указывает.

Ни одна из упомянутых вами операций не разрешена для var , но вы можете присвоить var другую строку:

NSString * anotherVar;
// Here some code giving a new value to anotherVar

var = anotherVar; // This is allowed (with a memory leak if GC is disabled)

// The following is also allowed: -stringWithFormat: creates a new object
var = [var stringWithFormat:@"%@ with more chars", var];
11
ответ дан 5 December 2019 в 04:52
поделиться

Неизменяемая строка (или вообще любой неизменяемый объект) - это строка, которую нельзя изменить вообще после инициализации.

Вот преимущество использования неизменяемых строк в (псевдо-) псевдокоде:

// if using mutable strings
let a = "Hello World";
let b = a;
a.replace("Hello", "Goodbye");

Что теперь имеет место? "Привет мир"? "Прощай мир"? Что же содержит b?

Если строки изменяемы, тогда он может содержать "Goodbye World". Это может быть то, что вы хотите. Возможно, это не так.

При неизменности становится очень ясно, что b по-прежнему указывает на исходную строку, потому что метод replace не мог изменить фактическую строку, а скорее вернул ссылку на новую строку.

В этом примере вы можете не увидеть большой пользы. Но если на a и b есть ссылки и они используются в разных частях кода или в разных потоках, наличие неизменяемых ссылок устраняет множество потенциальных ошибок.

2
ответ дан 5 December 2019 в 04:52
поделиться