1. 사전 프로젝트 코드 세팅하고 오기

 

https://growingsaja.tistory.com/869

 

[Objective-C] 프로젝트 기본 세팅 소스코드 예시

1. AppDelegate 수정 with 설명 // vim AppDelegate.h #import // MARK: - [클래스 설명] /* // ----------------------------------------- 1. 애플리케이션 딜리게이트 (선언부) 2. 전역변수 , 메소드 , 인스턴스변수 (클래스 생

growingsaja.tistory.com

 

 

 

 

 

2. Array 만들고 count 세고 String으로 출력해보기 실습 소스코드

 

// vim ViewController.m

// ViewController.h 파일을 import하여 해당 클래스의 정의를 가져옵니다.
#import "ViewController.h"


// MARK: - [헤더 [선언부] 호출]
@interface ViewController ()
@end
@implementation ViewController



// MARK: - [클래스 설명]
/*
// -----------------------------------------
1. ViewController (구현부)
2. ios 13 이상 사용 : API_AVAILABLE(ios(13.0))
// -----------------------------------------
*/



// MARK: - [뷰 로드 실시]
// 메서드를 구현합니다. 이 메서드는 뷰 컨트롤러의 뷰가 메모리에 로드된 후에 호출되는 메서드입니다.
- (void)viewDidLoad {
    // 부모 클래스인 UIViewController의 viewDidLoad 메서드를 호출합니다.
    [super viewDidLoad];
    NSLog(@"[ViewController >> viewDidLoad() :: 뷰 로드 실시]");
}



// MARK: - [뷰 로드 완료]
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"[ViewController >> viewWillAppear() :: 뷰 로드 완료]");
}



// MARK: - [뷰 화면 표시]
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"[ViewController >> viewDidAppear() :: 뷰 화면 표시]");
    
    [self testMain];
}



// MARK: - [뷰 정지 상태]
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSLog(@"[ViewController >> viewWillDisappear() :: 뷰 정지 상태]");
}


// MARK: - [뷰 종료 상태]
- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    NSLog(@"[ViewController >> viewDidDisappear() :: 뷰 종료 상태]");
}

- (void)testMain {
    NSLog(@"[ViewController >> testMain() :: 테스트 메소드 수행]");
    
    /*
    // ------------------------------------
    [요약 설명]
    // ------------------------------------
    1. NSArray : 배열 선언으로 가변 길이의 데이터를 가질 수 있습니다
    // ------------------------------------
    2. initWithObjects : 배열에 object 형식으로 데이터를 삽입합니다
    // ------------------------------------
    3. 배열 마지막에 nil 삽입 : 배열 끝임을 알리는 nil을 삽입합니다
    // ------------------------------------
    */
    
    
    // [배열 선언 및 데이터 삽입]
    NSArray *array = [[NSArray alloc] initWithObjects:@"사자", @15, nil];
    
    
    // [배열 개수 카운트 실시]
    NSLog(@"[array count :: %lu]", (unsigned long)[array count]);
    
    
    // [배열 전체 목록 확인 실시]
    NSString *arrayData = [NSString stringWithFormat:@"%@", [array componentsJoinedByString:@", "]];
    NSLog(@"[array data :: %s]", arrayData.description.UTF8String);
}



// -----------------------------------------
@end
// -----------------------------------------

 

 

 

 

 

3. Array 만들고 count 세고 String으로 출력해보기 실습 결과 예시

 

 

 

 

 

 

4. Array 데이터 생성 예시

 

NSArray는 배열 데이터 생성 후 변경이 불가능합니다.

NSArray로 배열 데이터 생성 방법은 여러가지가 있습니다.

 

testArray3처럼 만드는 것이 가장 간편하여 권장하는 사용법입니다.

 

// vim main.m

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSArray *testArray1 = [[NSArray alloc] init];
        NSArray *testArray2 = [[NSArray alloc] initWithObjects:@"Harry", @"Max", @"Json", nil];
        NSArray *testArray3 = @[@"Harry", @"Max", @"Json"];
    }
    return 0;
}

 

 

 

 

 

5. 변경이 가능한 Array를 만들기 위해서는 NSMutableArray를 사용합니다.

 

Incompatible pointer types initializing 'NSMutableArray *' with an expression of type 'NSArray *'

arrayTmp2처럼 작성하는 것이 권장됩니다. 바로 array를 입력해 데이터를 넣으며 생성할 경우, 위와 같은 오류가 발생합니다. @[@"A", @"C", @"D"] 표현은 NSArray 형태이기 때문에, NSArray를 NSMutableArray로 선언하며 넣어서 발생하는 문제입니다.

 

// vim main.m

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSArray *testArray1 = [[NSArray alloc] init];
        NSArray *testArray2 = [[NSArray alloc] initWithObjects:@"Harry", @"Max", @"Json", nil];
        NSArray *testArray3 = @[@"Harry", @"Max", @"Json"];
        NSMutableArray *arrayTmp1 = [testArray3 mutableCopy];
        NSMutableArray *arrayTmp2 = [@[@"A", @"B", @"C", @"D"] mutableCopy];
        arrayTmp2[1] = @"Z";
        NSLog(@"%@", arrayTmp2);
    }
    return 0;
}

 

 

 

 

 

6. NSMutableArray에 데이터 추가

 

// vim main.m

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSArray *testArr = @[@"hi", @"hello", @33];
        
        NSMutableArray *arrReal = [testArr mutableCopy];
        [arrReal addObject:@"Hey Yoy!"];
        arrReal[4] = @999;
        arrReal[arrReal.count] = @"Wow~";
        
        for (int i=0; i<arrReal.count; i++) {
            NSLog(@"%@", arrReal[i]);
        }
    }
    return 0;
}

 

 

 

 

 

7. NSMutableArray에서 특정 위치에 data insert하기 및 특정 data가 있는 index 찾기 예제

 

여기에서 index 찾는 예제 결과에서 알 수 있듯이, indexOfObject를 통해 찾으면 1번째 index만 나옵니다.

즉, index 1, 3에 특정 value가 존재한다면, 1이라고만 return됩니다.

 

// vim main.m

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSArray *testArr = @[@"hi", @"hello", @33];
        
        NSMutableArray *arrReal = [testArr mutableCopy];
        
        [arrReal insertObject:@33 atIndex:1];
        for (int i=0; i<arrReal.count; i++) {
            NSLog(@"%@", arrReal[i]);
        }
        
        unsigned long whereIsIt = [arrReal indexOfObject:@33];
        
        NSLog(@"%lu", whereIsIt);
        
    }
    return 0;
}

 

 

 

 

 

8. 특정 Value를 Array가 element로 보유하고 있는지 확인하기 : 3가지 방법

 

  a. contailsObject 사용

NSArray *array = @[@"apple", @"banana", @"orange"];
NSString *searchString = @"banana";

if ([array containsObject:searchString]) {
    NSLog(@"배열이 %@ 요소를 포함합니다.", searchString);
} else {
    NSLog(@"배열이 %@ 요소를 포함하지 않습니다.", searchString);
}

 

  b. for문과 isEqualToString 사용

NSArray *array = @[@"apple", @"banana", @"orange"];
NSString *searchString = @"banana";
BOOL containsElement = NO;

for (NSString *element in array) {
    if ([element isEqualToString:searchString]) {
        containsElement = YES;
        break;
    }
}

if (containsElement) {
    NSLog(@"배열이 %@ 요소를 포함합니다.", searchString);
} else {
    NSLog(@"배열이 %@ 요소를 포함하지 않습니다.", searchString);
}

 

c. enumerateObjectsUsingBlock 사용

NSArray *array = @[@"apple", @"banana", @"orange"];
NSString *searchString = @"banana";
__block BOOL containsElement = NO;

[array enumerateObjectsUsingBlock:^(NSString *element, NSUInteger idx, BOOL *stop) {
    if ([element isEqualToString:searchString]) {
        containsElement = YES;
        *stop = YES;
    }
}];

if (containsElement) {
    NSLog(@"배열이 %@ 요소를 포함합니다.", searchString);
} else {
    NSLog(@"배열이 %@ 요소를 포함하지 않습니다.", searchString);
}

 

 

 

 

 

9. 특정 String을 Array에 있는 element가 보유하고 있는지 확인하기 : 3가지 방법

 

  a. for문과 NSString의 containsString 사용

NSArray *array = @[@"apple", @"banana", @"orange"];
NSString *searchString = @"an";
BOOL containsString = NO;

for (NSString *element in array) {
    if ([element containsString:searchString]) {
        containsString = YES;
        break;
    }
}

if (containsString) {
    NSLog(@"배열이 %@ 문자열을 포함합니다.", searchString);
} else {
    NSLog(@"배열이 %@ 문자열을 포함하지 않습니다.", searchString);
}

 

  b. NSPredicate의 predicateWithFormat 사용

NSArray *array = @[@"apple", @"banana", @"orange"];
NSString *searchString = @"an";

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[c] %@", searchString];
NSArray *filteredArray = [array filteredArrayUsingPredicate:predicate];

if (filteredArray.count > 0) {
    NSLog(@"배열이 %@ 문자열을 포함합니다.", searchString);
} else {
    NSLog(@"배열이 %@ 문자열을 포함하지 않습니다.", searchString);
}

 

  c. NSArray의 enumerateObjectsUsingBlock 사용

NSArray *array = @[@"apple", @"banana", @"orange"];
NSString *searchString = @"an";
__block BOOL containsString = NO;

[array enumerateObjectsUsingBlock:^(NSString *element, NSUInteger idx, BOOL *stop) {
    if ([element containsString:searchString]) {
        containsString = YES;
        *stop = YES;
    }
}];

if (containsString) {
    NSLog(@"배열이 %@ 문자열을 포함합니다.", searchString);
} else {
    NSLog(@"배열이 %@ 문자열을 포함하지 않습니다.", searchString);
}

 

 

 

 

 

10. 특정 Value가 Array 안에 여러개인 경우, 그 모든 index를 찾는 예제 - for, if, isEqualToString를 활용

 

// vim main.m

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSArray *testArr = @[@"TEST", @"hi",@"TEST", @"hello", @"TEST"];
        
        NSMutableArray *arrReal = [testArr mutableCopy];
        
        NSString *searchWord = @"TEST";
        NSMutableArray *searchIndexArr = [[NSMutableArray alloc] init];
        
        for (int i=0; i<testArr.count; i++) {
            if ([testArr[i] isEqualToString:searchWord]) {
                [searchIndexArr addObject:@(i)];
            }
        }
        NSLog(@"%@", searchIndexArr);
    }
    return 0;
}

 

 

 

 

 

11. 특정 Value가 Array 안에 여러개인 경우, 그 모든 index를 찾는 예제 - for, if, isEqualToString를 활용

 

// vim main.m

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSArray *testArr = @[@"TEST", @"hi",@"TEST", @"hello", @"TEST"];
        
        NSString *searchWord = @"TEST";
        NSMutableArray *matchingIndexArr = [[NSMutableArray alloc] init];
        
        [testArr enumerateObjectsUsingBlock:^(id eachValue, NSUInteger index, bool *stop) {
            if ([eachValue isEqualToString:searchWord]) {
                [matchingIndexArr addObject: @(index)];
            }
        }];
        
        [matchingIndexArr enumerateObjectsUsingBlock:^(id eachObj, NSUInteger i, bool *stop) {
            NSLog(@"%@", eachObj);
        }];
    }
    return 0;
}

 

 

 

 

 

12. 특정 Value가 Array 안에 여러개인 경우, 그 모든 index를 찾는 예제 - enumerateObjectsUsingBlock, isEqualToString를 활용

 

enumerateObjectsUsingBlock 활용을 위해 index 2 초과인 경우에는 stop 값을 YES로 변경시켜 loop를 탈출하도록 만들었습니다.

 

// vim main.m

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSArray *testArr = @[@"TEST", @"hi",@"TEST", @"hello", @"TEST"];
        
        NSString *searchWord = @"TEST";
        NSMutableArray *matchingIndexArr = [[NSMutableArray alloc] init];
        
        [testArr enumerateObjectsUsingBlock:^(id eachValue, NSUInteger index, bool *stop) {
            if ([eachValue isEqualToString:searchWord]) {
                [matchingIndexArr addObject: @(index)];
            }
        }];
        
        [matchingIndexArr enumerateObjectsUsingBlock:^(NSNumber *eachObj, NSUInteger i, bool *stop) {
            if (eachObj.integerValue > 2) {
                *stop = YES;
            } else {
                NSLog(@"%@", eachObj);
            }
        }];
    }
    return 0;
}

 

+ Recent posts