2015-09-07 2 views
-1

Есть ли способ вызвать или передать метод по свойству. Я понимаю, как устанавливать и получать свойства, но как я могу ими манипулировать? Я пытаюсь удалить пунктуацию на строку с помощью объектно-ориентированного программирования. Действие удаления пунктуации из входной строки записывается как метод.Вызвать метод по объекту

main.m

TDItem *newItem = [[TDItem alloc] init]; 

[newItem setItemString:@"Get the mail next Tuesday!"]; 
NSLog(@"\nCreated Item: %@", [newItem itemString]); 

NSString *itemStringWithoutPunctuation = [[NSString alloc] init]; 
[newItem itemStringWithoutPunctuation:[newItem itemString]]; 
[newItem setItemString:itemStringWithoutPunctuation]; 
NSLog(@"\nCreated Item: %@", [newItem itemString]); 

TDItem.h

@interface TDItem : NSObject 

@property NSString *itemString; 


// Formating methods 
- (NSString *)itemStringWithoutPunctuation:(NSString *)itemString; 

TDItem.m

- (NSString *)itemStringWithoutPunctuation:(NSString *)itemString 
{ 
NSString* itemStringWithoutPunctuation = [[itemString componentsSeparatedByCharactersInSet:[[NSCharacterSet letterCharacterSet] invertedSet]] componentsJoinedByString:@" "]; 
return itemStringWithoutPunctuation; 
} 


Отладочная консоль выводит пробел для нового значения itemString.

Debuger

Created Item: Get the mail next Tuesday! 
Created Item: 

Если это совершенно неверный, что идти об изменении значения свойства?

ответ

0

Чтобы ответить на ваш вопрос:

NSString *itemStringWithoutPunctuation = [[NSString alloc] init]; // note: immutable string 
[newItem itemStringWithoutPunctuation:[newItem itemString]]; // does NOT save the result! 
[newItem setItemString:itemStringWithoutPunctuation]; // sets itemString to the empty string 
NSLog(@"\nCreated Item: %@", [newItem itemString]); 

Вместо этого:

NSString* itemStringWithoutPunctuation = [newItem itemStringWithoutPunctuation:[newItem itemString]]; 
[newItem setItemString:itemStringWithoutPunctuation]; 
NSLog(@"\nCreated Item: %@", [newItem itemString]); 

Примечание: Свойства имеют более удобный синтаксис

С itemString является имущество, вы можете получить доступ к нему гораздо более чисто с помощью синтаксиса . Топор:

newItem.itemString = @"Hello, world" ; 
NSLog (@"The string is: %@" , newItem.itemString) ; 

Примечание: Alternate место, чтобы поместить код

Почему itemStringWithoutPunctuation метод экземпляра на вашем NewItem классе? Это не имеет смысла, особенно требуя передать эту строку в

Вы можете, вместо этого, сделать это:.

@interface NSString (MyCustomAdditions) 
- (NSString*) stringByRemovingPunctuation ; 
@end 

@implementation NSString (MyCustomAdditions) 
- (NSString*) stringByRemovingPunctuation { 
    return [[self componentsSeparatedByCharactersInSet:[[NSCharacterSet letterCharacterSet] invertedSet]] componentsJoinedByString:@" "]; 
} 
@end 

// elsewhere... 
NSString* itemStringWithoutPunctuation = [newItem.itemString stringByRemovingPunctuation] ; 
newItem.itemString = itemStringWithoutPunctuation ; 

В качестве альтернативы, вы можете сделать это:

@interface TDItem : NSObject 
@property NSString* itemString ; 
- (NSString*) itemStringWithoutPunctuation ; 
@end 

// elsewhere 
TDItem * item = [ [TDItem alloc] init ] ; 
NSLog (@"The string is: %@" , item.itemString) ; 
NSLog (@"The string, without punctuation, is: %@" , [item itemStringWithoutPunctuation]) ; 

Однако я бы предостерег вас: ваш код, чтобы удалить пунктуацию, вероятно, не делает то, что вы думаете, что это делает, но вы скоро это обнаружите и сможете исправить.

+0

Почему вы указали переменную 'itemStringWithoutPunctuation' как' id' вместо 'NSString'? – rmaddy

+0

Меньше набрав. 'id' может использоваться вместо' MyClass * 'во многих случаях. – iAdjunct

+0

И использование 'id' может привести ко всем видам ошибок, поскольку компилятор не может выполнять проверку типов. – rmaddy

Смежные вопросы