2013-05-26 6 views
0

나는 코코아/Objective-C에 대해 배우고 있으며 NSString을 수정하고 문자열에서 개별 문자를 편집 할 수 있도록 노력하고 있습니다. 난 그것을 배열의 문자로 변경하고 그것을 다시 변경할 수있게되었지만 c[0] = 'b'을 시도하면 "읽기 전용 변수를 할당 할 수 없습니다"라고 표시됩니다. .m 파일과 .h 파일을 포함 시켰습니다.Objective-C의 개별 문자 편집

은하는 .m 파일입니다

import "AppDelegate.h" 

@implementation AppDelegate 

@synthesize textField, myLabel; 

-(IBAction)changeLabel:(id)sender { 
    NSString *message = [[NSString alloc] initWithFormat:@"Hello, %@!", [textField stringValue]]; 
    NSString *message2 = [[NSString alloc] initWithFormat:@"%@ This part was added on afterwards.", message]; 
    const char *c = [message2 UTF8String]; 
    c[0] = 'b'; 
    NSString *output; 
    output = [NSString stringWithCString:c encoding:NSASCIIStringEncoding]; 
    [myLabel setStringValue:output]; 
} 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 

} 

@end 

이것은 .H 파일 : 그것은 비록 내가

@interface AppDelegate : NSObject <NSApplicationDelegate> 

@property (assign) IBOutlet NSWindow *window; 
@property (weak) IBOutlet NSTextField *textField; 
@property (weak) IBOutlet NSTextField *myLabel; 

-(IBAction)changeLabel:(id)sender; 
@property (weak) IBOutlet NSTextField *changeButtonText; 

@end 

I는 관련되지 않은 .H 파일을 가정하고 있습니다 만, 그것을 포함 시켜라.

답변

0

NSString변경 불가능한 문자열의 컨테이너입니다. official reference에서 촬영 :

는 NSString 클래스는 불변 문자열을 관리하는 개체에 대한 프로그래밍 인터페이스를 선언합니다. 불변의 문자열은 그것이 만들어 질 때 정의 된 텍스트 문자열이며,이어서 은 변경할 수 없습니다.

는 기본적으로, 단지 코코아를 사용하여, 당신과 함께 예를 들어, 기존의 문자열의 문자를 대체하여 새로운 NSString의를 생성 할 수 있습니다

- (NSString *)stringByReplacingCharactersInRange:(NSRange)range withString:(NSString *)replacement 

하지만 당신은 동일한 개체를 수정할 수 없습니다. 이 이유 때문에 정확히 UTF8String은 문자 시퀀스에 대한 불변 포인터 인 const char*을 반환합니다. 그래서 당신은 오류가 발생합니다.

제공된 NSString 메서드를 사용하여 const char* C 문자열을 char* (예 : strdup) 문자열로 복사 할 수 있습니다.

0

c는 const char*입니다.> 초기화 값은 전체 런타임에 걸친 값입니다. 어쩌면 const 키워드를 지워야합니다.

+0

'UTF8String' 메시지는'const char *'를 반환합니다. 한정어를 삭제하는 것은 좋은 생각이 아닙니다. – Jack

+0

정말 고마워요. 그럼에도 불구하고 경고를받습니다. – dunnmifflsys

+0

@ user2423270 - 작동 할 수도 있지만 Jack이 말하듯이 이것은 좋은 생각이 아닙니다. 변경하지 않아야하는 메모리에 대한 포인터가 부여되었으므로 변경하는 것이 현명합니다. – CRD

0

Objective-C에서 NSString 인스턴스는 수정할 수 없으며 수정 가능한 문자열의 경우 NSMutableString이 필요합니다. 또는 이전 문자열에서 새 문자열을 만들 수 있습니다. 불행히도 NSMutableString/NSStringcharacterAtIndex:의 역수를 가지지 않습니다. 한 문자를 변경하려면 변경할 문자의 길이 - 위치 & 길이를 제공하는 stringByReplaceCharactersInRange:withString:/replaceCharactersInRange:withString:을 사용해야합니다. 여기에 코드의 일부입니다 먼저 새로운 문자열을 생성, 이들을 사용하여 다시 작성 :

NSString *message2 = [[NSString alloc] initWithFormat:@"%@ This part was added on afterwards.", message]; 
NSString *output = [message2 stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:@"b"]; 

이 첫 번째 옵션은 새로운 문자열을 만듭니다. 수정 문자열을 사용 :

NSMutableString *message2 = [[NSMutableString alloc] initWithFormat:@"%@ This part was added on afterwards.", message]; 
[message2 replaceCharactersInRange:NSMakeRange(0,1) 

이 두 번째 옵션 것은 message2에 의해 참조 문자열을 변경합니다.

새 문자열을 만들거나 수정 가능한 문자열을 사용하는지 여부는 변경할 사항의 수와 원래 문자열을 유지해야하는지 여부에 따라 달라집니다.

관련 문제