1. 사전 프로젝트 코드 세팅하고 오기
https://growingsaja.tistory.com/869
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;
}
'Development > iOS' 카테고리의 다른 글
[Objective-C] 입문하기 - 08 : error에 대하여 try, catch, finally 실습 (0) | 2023.06.23 |
---|---|
[Objective-C] 입문하기 - 07 : for , while 반복문과 if else , switch case default 조건문 실습 (0) | 2023.06.23 |
[Objective-C] 입문하기 - 05 : property 프로퍼티 사용해 변수 선언 및 get , set 데이터 지정 및 호출 실습 (0) | 2023.06.22 |
[Objective-C] 입문하기 - 04 : 간단한 클래스와 인스턴스를 만들어보고 실행해보기 (0) | 2023.06.22 |
[Objective-C] 프로젝트 기본 세팅 소스코드 예시 (0) | 2023.06.15 |