Objective-C-문자열에서 마지막 문자 제거


답변:


418

컨트롤러 클래스에서 Interface Builder에서 버튼을 연결할 액션 메소드를 만듭니다. 이 방법 내에서 다음과 같이 문자열을자를 수 있습니다.


if ([string length] > 0) {
    string = [string substringToIndex:[string length] - 1];
} else {
    //no characters to delete... attempting to do so will result in a crash
}






한 줄의 코드 로이 작업을 수행하는 멋진 방법을 원한다면 다음과 같이 작성할 수 있습니다.

string = [string substringToIndex:string.length-(string.length>0)];

* 공상적인 한 줄짜리 코드 스 니펫 설명 :

삭제할 문자가있는 경우 (즉, 문자열 길이가 0보다 큰 경우)
     (string.length>0)리턴 1 하여 코드를 리턴합니다.
          string = [string substringToIndex:string.length-1];

삭제할 문자가없는 경우 (예 : 문자열은 0보다 큰)이 아니다
     (string.length>0)반환 0 : 따라서 코드 반환을
          string = [string substringToIndex:string.length-0];
     방지 충돌합니다.


8
귀하의 솔루션에는 1 버그가 있습니다. [string substringToIndex : [string length]-1]이어야합니다.
Jim Correia

"string"은 "string.text"또는 문자열 이름 만 나타냅니다
Omar

고마워 짐, 아침에 산술을하기에는 너무 이르다. :) Omar, string은 수정할 텍스트를 포함하는 string이라는 변수를 나타냅니다. 디스크의 파일 또는 응용 프로그램의 데이터에서 NSString 객체를 생성 할 수있는 여러 가지 방법에 대한 설명서를 살펴볼 수 있습니다.
Marc Charbonneau

1
@DonalRafferty는 문자열이 0이 아닌지 확인하십시오
quantumpotato

문자열이 nil이면 괜찮습니다. 정수 값을 반환하는 메서드를 호출하면 Obj-C에서 0이 반환됩니다 (부동 소수점 반환 값의 경우도 마찬가지 임). 따라서 if 문은 묻는 것과 같습니다 string != nil && [string length] > 0. Donal의 문자열 변수가 초과 릴리스되었을 가능성이 있습니다.
Marc Charbonneau

53

NSMutableString 인 경우 (동적으로 변경 한 후 권장하는 경우) 다음을 사용할 수 있습니다.

[myString deleteCharactersInRange:NSMakeRange([myRequestString length]-1, 1)];

8

여기에 제공된 솔루션은 실제로 멀티 바이트 유니 코드 문자 ( "구성된 문자")를 고려하지 않으며 유효하지 않은 유니 코드 문자열을 초래할 수 있습니다.

실제로 선언이 substringToIndex포함 된 iOS 헤더 파일 에는 다음 주석 이 포함됩니다.

힌트 : rangeOfComposedCharacterSequencesForRange와 함께 사용하여 구성된 문자가 깨지지 않도록하십시오.

마지막 문자를 올바르게 삭제 하는 방법을rangeOfComposedCharacterSequenceAtIndex: 참조하십시오 .


6

문서는 당신의 친구이며, 단축 문자열을 반환하는 문자열을 단축 할 수 NSString있는 호출 substringWithRange을 지원합니다 . 인스턴스 NSString는 변경할 수 없습니다. 가있는 경우 문자열을 수정할 수 NSMutableString있는 메소드 deleteCharactersInRange가 있습니다.

...
NSRange r;
r.location = 0;
r.size = [mutable length]-1;
NSString* shorted = [stringValue substringWithRange:r];
...

1
NSMakeRange는 때때로 범위 구조체를 조금 더 우아하게 보이게 만들 수 있습니다.
dreamlax

@Harald는를 substringWithRange:반환합니다 NSString*. 포인터를 기록해 두십시오.
토마스 나딘
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.