Objective-C의 루프를 위해 네스트된2개를 분리하려면 어떻게 해야 하나요?
이렇게 네스트된 루프는 2개입니다.
for(...) {
for(...) {
}
}
나는 알고 있다.break
진술.하지만 두 개의 루프가 모두 고장난 것인지 아니면 호출된 루프가 고장난 것인지 헷갈립니다.몇 번이고 반복하는 게 말이 안 된다는 걸 알게 되면 둘 다 깨야 해.
goto를 사용하여 코드를 간략화 할 수 있다면 적절합니다.
for (;;)
{
for (;;)
{
break; /* breaks inner loop */
}
for (;;)
{
goto outer; /* breaks outer loop */
}
}
outer:;
break 문은 부모 루프인 스코프 내의 루프에서만 분리됩니다.두 번째 루프에서도 브레이크아웃을 하려면 양쪽 루프의 범위 내에 있는 부울 변수를 사용할 수 있습니다.
bool isTerminated = false;
for (...)
{
if (!isTerminated)
{
for(...)
{
...
isTerminated = true;
break;
}
}
else
{
break;
}
}
break은 하나의 루프에서 분리되지만 내부가 분리될 때 차단되는 외부 루프에 체크를 추가할 수 있습니다.
bool dobreak = false;
for ( ..; !dobreak && ..; .. ) {
for ( ... ) {
if (...) {
dobreak = true;
break;
}
}
}
그break
스테이트먼트는 가장 안쪽 루프에서 벗어날 수 있을 뿐입니다.전용 상태 변수의 코드, 메모리 및 성능에서 추가 오버헤드를 원하지 않는다면 코드를 자체 함수 또는 방식으로 리팩터링하여 사용할 것을 권장합니다.return
모든 루프에서 벗어나려면:
void do_lots_of_work(void)
{
int i, j;
for(i=0; i<10 ; i++)
{
for(j=0;j< 10; j++)
{
..
..
if(disaster_struck())
return; /* Gets us out of the loops, and the function too. */
}
}
}
다른 사람들은 플래그를 설정하거나 플래그를 사용하는 방법에 대해 언급했습니다.goto
내부 루프가 다른 방법으로 전환되도록 코드를 리팩터링하는 것이 좋습니다.이 메서드는 외부 루프가 다음과 같은 플래그를 반환할 수 있습니다.break
메서드의 이름을 적절하게 지정하면 훨씬 읽기 쉬워집니다.
for (int i = 0; i < 10; i++) {
if (timeToStop(i)) break;
}
-(bool) timeToStop: (int) i {
for (int j = 0; j < 10; j++) {
if (somethingBadHappens) return true;
}
return false;
}
의사 코드, 테스트는 안 했지만 감이 잡혔어요
네스트 루프 세트 내에서 브레이크가 실행되면 브레이크가 실행되는 가장 안쪽 루프만 종료됩니다.(표준 C와 동일)
이미 언급한 플래그 변수 또는 goto 이외에 Objective-C 예외를 발생시킬 수 있습니다.
@try {
for() {
for() {
@throw ...
}
}
}
@catch{
...
}
중단 전에 상단 루프의 카운터 변경
for(i=0; i<10 ; i++)
for(j=0;j< 10; j++){
..
..
i = 10;
break;
}
가장 쉬운 방법은 "플래그" 변수를 사용하는 것입니다.
for(i=0; i<10 && (done==false); i++)
for(j=0;j< 10; j++){
..
..
if(...){done=true; break;}
}
또 다른 해결책은 함수의 두 번째 루프를 제외하는 것입니다.
int i;
for(i=0; i<10 ; i++){
if !innerLoop(i) {
break;
}
}
bool innerLoop(int i)
int j;
for(j=0;j< 10; j++){
doSomthing(i,j);
if(endcondtion){
return false;
}
}
}
break 문은 가장 안쪽 루프에서 분리됩니다.외부 루프를 브레이크하려면 추가 테스트 및 브레이크 문이 필요합니다.
지난번과 마찬가지로 일반적으로 다음과 같습니다.
for(i=0;i<a;i++){
for(j=0;j<a;j++){
if(Something_goes_wrong){
i=a;
break;
}
}
}
미소만 지으면 이 참/거짓 체크를 방법으로 변경하여return
스테이트먼트:
- (bool) checkTrueFalse: parameters{
for ( ...) {
for ( ... ) {
if (...) {
return true;
}
}
}
return false;
}
언급URL : https://stackoverflow.com/questions/863172/how-can-i-break-out-of-two-nested-for-loops-in-objective-c
'programing' 카테고리의 다른 글
Vuex 스토어의 Vue.set() 및 push() (0) | 2022.08.17 |
---|---|
Java에서의 jar와 war의 차이점 (0) | 2022.08.17 |
어나니머스 내부 클래스의 외부 클래스 (0) | 2022.08.17 |
v-select에서 선택한 옵션의 레이블에 사용자 지정 템플릿을 사용하는 방법 (0) | 2022.08.17 |
해시셋과 트리셋 (0) | 2022.08.17 |