Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Objective-C

Войти
Регистрация
Восстановить пароль
 
SeRG1k17
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 9
#1

Работа с NSArray, NSString - Objective-C

08.07.2015, 19:47. Просмотров 833. Ответов 6
Метки нет (Все метки)

Вообщем программа довольно простая: Есть AddressBook которая хранит название и массив, каждым элементом которого является AddressCard.
В задании было сказано:
1)изменить метод lookup, так чтобы он искал частичное совпадение по имени - ОК.
2)изменить метод lookup, так чтобы он искал все соответствия по имени и возвращал массив -ОК.
3)добавить метод -(BOOL)removeNameNSstring *) theName;
Если имя не найдено или существует несколько записей метод должен возвращать NO. Если же 1 значение найдено, удалить его - возвратить YES.
Удаление целиком name and email я сделал, но я хочу просто очищать одно из полей.
Делал так создал массив, запустил для него lookup, он нашел количество записей, проверил количество.
Нашел индекс в массиве book через вспомогательный массив, в котором содержится "очищаемое" поле.
Теперь хочу сделать так
[[[book objectAtIndex:theInt]name] setString: @""];
Но XCode даже не видит этого метода, мол name это немутабельная строка.

Сделал все массивы и строки мутабельными -ничего не изменилось.
Мои предположения по проблеме:
-требуется наследование
-требуются методы доступа(синтезируемые методы)

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#import <Foundation/Foundation.h>
 
@interface AddressCard : NSObject
{
    NSMutableString *name;
    NSMutableString *email;
}
@property(copy,nonatomic) NSString *name,*email;
 
-(void)setName: (NSString *) theName;
-(void)setEmail:(NSString *) theEmail;
-(void)setName: (NSString *) theName andEmail: (NSString *) theEmail;
-(BOOL)isEqual:(AddressCard *)theCard;
-(NSComparisonResult)compareNames:(id)element;
-(void)print;
 
@end
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#import "AddressCard.h"
 
@implementation AddressCard
 
@synthesize name,email;
 
-(void)setName:(NSString *) theName
{
    name=[[NSMutableString alloc]initWithString: theName];
}
-(void)setEmail:(NSString *)theEmail
{
    email=[[NSMutableString alloc]initWithString:theEmail];
}
-(void)setName:(NSString *)theName andEmail:(NSString *)theEmail
{
    self.name=theName;
    self.email=theEmail;
}
-(BOOL)isEqual:(AddressCard *)theCard
{
    if ([name isEqualToString:theCard.name]==YES &&
        [email isEqualToString:theCard.email]==YES) {
        return YES;
    }
    else
        return NO;
}
-(NSComparisonResult)compareNames:(id)element
{
    return [name compare:[element name]];
}
-(void)print
{
    NSLog(@"==============================================");
    NSLog(@"|                                             ");
    NSLog(@"|   %-31s |",[name UTF8String]);
    NSLog(@"|   %-31s |",[email UTF8String]);
    NSLog(@"|                                             ");
    NSLog(@"|                                             ");
    NSLog(@"|                                             ");
    NSLog(@"|                                             ");
    NSLog(@"|         0                    0              ");
    NSLog(@"==============================================");
}
 
@end
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#import <Foundation/Foundation.h>
#import "AddressCard.h"
 
@interface AddressBook : NSObject
{
    NSMutableString *bookName;
    NSMutableArray *book;
}
-(id)initWithName:(NSString *) name;
-(void)addCard:(AddressCard *) theCard;
-(NSMutableArray *)lookup:(NSString *)theName;
-(void)removeCard:(AddressCard *)theCard;
-(BOOL)removeName:(NSString *)theName;
-(int) entries;
-(void)sort;
-(void)list;
 
@end
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#import <Foundation/Foundation.h>
#import "AddressBook.h"
#import "AddressCard.h"
 
@implementation AddressBook
 
-(id)initWithName:(NSString *)name
{
    self=[super init];
    if (self) {
        bookName=[[NSMutableString alloc]initWithString:name];
        book=[[NSMutableArray alloc]init];
    }
    return self;
}
-(void)addCard:(AddressCard *)theCard
{
    [book addObject:theCard];
}
-(NSMutableArray *)lookup:(NSString *)theName
{
    NSMutableArray *theArray=[NSMutableArray arrayWithCapacity:1];
    NSRange subRange;
    
    for (AddressCard *nextCard in book) {
        subRange=[[[nextCard name] uppercaseString] rangeOfString:[theName uppercaseString]];
        if (subRange.location!=NSNotFound ) {
            [theArray addObject:nextCard];
        }
    }
    return theArray;
}
-(void)removeCard:(AddressCard *)theCard
{
    [book removeObjectIdenticalTo:theCard];
}
-(BOOL)removeName:(NSString *)theName
{
    NSMutableArray *theArray;
    theArray=[self lookup:theName];
    if ([theArray count]>1) {
        return NO;
    }
    else if ([theArray count]==0)
        return NO;
    else
    {
        unsigned long theInt=[book indexOfObject:[theArray objectAtIndex:0]];
        NSLog(@"Number %li and name %@",theInt,[[book objectAtIndex:theInt]name]);
        //[[[book objectAtIndex:theInt]name] setString: @""];
 
        return YES;
    }
}
-(int)entries
{
    return (int)[book count];
}
-(void)sort
{
    [book sortedArrayUsingSelector:@selector(compareNames:)];
}
-(void)list
{
    NSLog(@"============Contents of: %@ =================",bookName);
    
    for (AddressCard *theCard in book) {
        NSLog(@"%-20s   %-32s",[theCard.name UTF8String],[theCard.email UTF8String]);
    }
    NSLog(@"=========================================================");
}
 
 
@end
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2015, 19:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с NSArray, NSString (Objective-C):

Подсчет повторяющихся значений в NSArray - Objective-C
Доброго времени суток. Допустим есть гараж, в гараже машины, у каждой машины есть марка (хонда, бмв, лада и т.д ). Как мне подсчитать...

Смена кодировки NSString - Objective-C
ДВС, всем! На ГитХабе нашел парсер HTML (Objective-C-HMTL-Parser ), встроил его в свой проект, далее - получаю страницу, распарсиваю ее,...

Подсчет слов в строке типа NSString - Objective-C
Доброго времени суток.. Я начинающий программист на objective C, поэтому прошу помощи в решение следующей проблемы: Есть переменная S...

Преобразование из NSString в BOOL - Программирование iOS
У меня есть строка NSString *out ; как мне ее преобразовать в BOOL?

Вырезка из NSString или NSMutableString - Программирование iOS
Есть строка NSString, ну или NSMutableString, можно получить любую из них. Нужно получить один символ. Допустим в строка &quot;Информатика&quot;,...

NSString *const и инициализация им NSURL - Программирование iOS
Добрый день! Что можете посоветовать в такой ситуации: Разбираю данные после парсинга JSON, получаю на определенном этапе NSArray со...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
SeRG1k17
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 9
10.07.2015, 18:50  [ТС] #2
Objective-C
1
2
3
4
NSMutableString *str=[[NSMutableString alloc]initWithString:@"Hello worldl!"];
    NSLog(@"%@",str);
    [str setString:@""];
        NSLog(@"%@",str);
Так работает, в программе нет
UP!
0
rian
0 / 0 / 0
Регистрация: 21.02.2009
Сообщений: 42
12.07.2015, 14:59 #3
так в программе же они вроде NSString написаны (кроме того, что там все как-то стремно, зачем тебе изменяемые строки, если ты их не меняешь, а затираешь пустой строкой)

Добавлено через 3 минуты
что за дивная проверка

[name isEqualToString:theCard.name]==YES
0
SeRG1k17
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 9
12.07.2015, 18:01  [ТС] #4
Решил проблему путем изменения в некоторых местах на Mutable
NSMutableString *mStr=[[book objectAtIndex:theInt]name];
[mStr setString: @"removed name"];
Да знаете собственно просто так сделал изменяемые строки, никто ж не застрахован, что в будущем не добавлю методов изменения тех самых строк, так лучше подстраховаться заранее.
что за дивная проверка

[name isEqualToString:theCard.name]==YES
а чем вас смущает такая проверка? Вот определение функции:
-(BOOL) isEqualToString: nsstring
0
rian
0 / 0 / 0
Регистрация: 21.02.2009
Сообщений: 42
12.07.2015, 18:17 #5
YES == YES
?
0
SeRG1k17
0 / 0 / 0
Регистрация: 08.07.2015
Сообщений: 9
12.07.2015, 18:30  [ТС] #6
Цитата Сообщение от rian Посмотреть сообщение
YES == YES
?
Окей можно написать и так:
[name isEqualToString:theCard.name]
Что-нибудь поменялось?
0
rian
0 / 0 / 0
Регистрация: 21.02.2009
Сообщений: 42
12.07.2015, 18:31 #7
оптимизация, лаконичность
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2015, 18:31
Привет! Вот еще темы с ответами:

Получить NSString из JSON и использовать его как заголовок в TableView - Программирование iOS
у меня в JSON файле есть вот такая строчка &quot;titles of sections&quot;: мне нужно поставить каждую строку в заголовок соответствующей...

NSString в Int - Swift
Возможно ли вообще перейти от NSString к Int? Если да, то подскажите, каким образом?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.07.2015, 18:31
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru