Показаны сообщения с ярлыком Class. Показать все сообщения
Показаны сообщения с ярлыком Class. Показать все сообщения

14 февр. 2014 г.

@property свойства класса


Ключевое слово @property позволяет объявить свойства класса в языке Objective C. По своей сути свойства являются средством написания кода, позволяющим удобно обращаться к полям класса, не нарушая принципа инкапсуляции и не используя синтаксис вызова методов. Свойства не обязательно должны базироваться на полях класса. Они могут, например, вычисляться во время каждого вызова. Основной смысл использования свойств – более удобный синтаксис в сравнении с обычными вызовами методов. Возможность использовать свойства появилась в языке Objective C начиная с версии 2.0. Для лучшего понимания принципов работы свойств рассмотрим несколько примеров. Предположим, у нас есть класс Car, содержащий поле speed для хранения скорости автомобиля. Тогда объявление этого класса будет выглядеть так:
@interface Car : NSObject
{
double speed;
}
-(double) getSpeed;
-(void) setSpeed:(double)s;
@end
Сообщения getSpeed и setSpeed позволяют читать и изменять закрытое поле speed, реализовывая принцип инкапсуляции. Реализация данного класса может выглядеть следующим образом:
@implementation Car
-(void) setSpeed:(double)s
{
if ( s>=0 )
{
speed = s;
}
}
-(double) getSpeed
{
return speed;
}
@end
Создание экземпляра этого класса и использование поля могут быть такими:
Car *car = [[Car alloc] init];
[car setSpeed:105];
NSLog(@"%f", [car getSpeed]);
[car release];
На приведенном выше примере можно увидеть, что чтение значений из полей класса и занесение новых значений синтаксически не очень удобно. Гораздо удобнее было бы напрямую обратиться к полям класса при помощи оператора -> Но тогда поля класса пришлось бы сделать открытыми и было бы невозможно контролировать значения, заносимые в поля. Применение свойств как раз и должно решить эту проблему. С использованием ключевого слова @property объявление класса примет такой вид:
@interface Car : NSObject{ double speed;} @property double speed; @end
Как видно из примера, при объявлении свойства указывается тип свойства и в данном случае он совпадает с типом поля класса. Так же Objective C допускает одинаковые названия свойств и полей классов. С учётом сделанных изменений, реализация класса будет такой:
@implementation Car
@synthesize speed;
@end
Упрощение кода в данном случае заметить не трудно. Мы просто убрали реализацию методов доступа к полю speed и заменили её на автоматическую генерацию поля при помощи ключевого слова @synthesize. Теперь попробуем воспользоваться созданным свойством:
Car *car = [[Car alloc] init];
car.speed = 45.5;
NSLog(@"%f", car.speed);
[car release];
Вот ради чего всё затевалось. Теперь мы можем обращаться к полю класса при помощи удобного оператора “точка”. В этом и есть основной смысл свойств. Но в этом коде всё ещё есть проблемы. Дело в том, что в поле speed можно запросто занести отрицательные значения. И данное автоматически сгенерированное свойство никак не может этому помешать. Такая реализация свойства не очень-то и полезна для класса Car. Поэтому переделаем реализацию, добавив в неё аксессоры для доступа к полю.
@implementation Car
-(void) setSpeed:(double)s
{
if(s>0) speed = s;
}
-(double) speed
{
return speed;
}
@end
Теперь свойство не позволит заносить в поле класса отрицательные значения. Несмотря на то, что кода стало больше, свойство защищает поле класса от некорректных значений. На примере можно увидеть, что имя метода, возвращающего значение, совпадает с именем свойства, а имя метода, записывающего новые значения почучается добавлением слова set в начало имени метода, название свойства начинается с большой буквы. В принципе, названия методов-аксессоров можно изменить. Для этого придётся внести изменения в объявление свойства:
@interface Car : NSObject
{
double speed;
}
@property (getter = getSpeed, setter = setSpeed:) double speed;
@end
После таких изменений объявления свойства метод, возвращающий значение свойства должен называться getSpeed, а метод задающий значение свойства, должен называться setSpeed.

NSString - работа со строкой

Класс NSString предоставляет возможность работы с неизменяемой строкой, которая представлена в виде массива символов в кодировке Unicode. Такая строка может быть однажды создана, но не может быть изменена всё время своего существования. Представление строк в виде объектов даёт возможность использовать большое количество методов для обработки строк, а также позволяет использовать строки везде, где можно использовать объекты Objective C. Объекты NSString могут быть легко получены на основе строк языка С, и наоборот, на основе объекта NSString можно получить строку C, заканчивающуюся символом с кодом 0. Для эффективной работы с изменяемыми строками следует пользоваться объектами класса NSMutableString.

Основные методы класса:



НазваниеОписание
uppercaseStringВозвращает строку, полученную из указанной путём перевода букв в верхний регистр
lowercaseStringВозвращает строку, полученную из указанной путём перевода букв в нижний регистр
capitalizedStringВозвращает строку, полученную из указанной путём перевода первых букв всех слов в верхний регистр
isEqualToStringПроверяет равенство двух строк
compareСравнивает две строки
stringWithCStringСоздаёт объект объект NSString на основе стандартной строки языка С
rangeOfStringВозвращает диапазон символов первой указанной строки, в который входит вторая указанная строка
componentsSeparatedByStringВозвращает объект NSArray, содержащий строки, полученные разделением указанной строки указанным строковым разделителем
componentsJoinedByStringВозвращает строку, полученную объединением массива строк
intValueПытается преобразовать строку в целое число и возвращает это число
doubleValueПытается преобразовать строку в число с плавающей запятой и возвращает это число
integerValueПытается преобразовать строку в объект NSInteger и возвращает этот объект
UTF8StringВозвращает строку языка С, полученную из указанного объекта NSString

Примеры использования:


Язык Objective C полностью поддерживает строки языка C. Вы можете в любой момент создать такую строку через указатель, а так же использовать средства языка С для обработки таких строк. Создать простую строку языка С можно так:

char * cString = "Hello world";

Каждая такая строка – это массив букв, который заканчивается символом с кодом 0. Вот ещё один способ создания строки языка С:
char cString[] = "Another string";
Основной недостаток строк в языке С – неудобство работы с ними. Существует много функций для обработки таких строк, но многие из них не так удобны, как хотелось бы и они часто работают напрямую с указателями на символы строк. Это может потенциально привести к ошибкам в работе со строками, поэтому в языке Objective C был предложен новый класс для работы со строками. Класс NSString содержит большое количество удобных и мощных методов для решения многих задач, возникающих при работе со строками. Для того, чтобы воспользоваться в программе объектом строки вовсе необязательно писать сложный код. Можно воспользоваться вот таким способом:
@"A constant Objective C string object";
Если вы хотите вывести объект NSString в консоль, можно воспользоваться форматированным выводом при помощи функции NSLog. В данном случае эта функция будет принимать 2 строки: первая – строка формата, вторая – строка параметра. В строке формата символы %@ будут заменены на строку параметра, после чего результирующая строка будет выведена в консоль.
NSLog (@"%@", @"This is a constant character string object");
Строки, созданные таким образом, являются объектами NSConstantString, который наследует от класса NSString и для них легко можно вызвать различные методы. Например, можно получить длину строки при помощи метода length:
int len = [@"Hello big world!" length];
NSLog (@"Length = %i", len);
Объект NSString позволяет управлять регистром букв в строке для этого есть несколько методов. Например, при помощи метода lowercaseString строку можно преобразовать в нижний регистр:
NSString *lowerStr = [@"SAMPLE STRING" lowercaseString];
NSLog(@"%@", lowerStr);
Строки можно сравнивать между собой, используя метод isEqualToString, который возвращает значение типа BOOL:
NSString *str1 = @"Abcd";
NSString *str2 = @"efghh";
BOOL equal = [str1 isEqualToString:str2];
NSLog(@"Strings is equal? %@", equal? @"YES" : @"NO");
Часто бывает нужно разделить строку на подстроки, используя какую-то разделяющую строку. Для этого достаточно вызвать метод  componentsSeparatedByString, который возвращает массив полученных подстрок. Метод принимает всего один параметр, это и есть разделяющая строка:
NSString *str = @"One, Two, Three";
NSArray *arr = [str componentsSeparatedByString:@", "];
NSLog(@"%@", arr);