레이블이 Objective-C인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Objective-C인 게시물을 표시합니다. 모든 게시물 표시

2019년 11월 12일 화요일

Objective-C NSMutableDictionary 활용법

오늘 포스팅 할 내용은 Objective-C 에서 주로 쓰이는 NSMutableDictionary 활용법에 대한 강좌 입니다.

NSMutableDictionary key/value 성 데이터를 관리의 목적으로 만들어진 Class 중 하나 입니다.

​NSMutableDictionary *variable = [[NSMutableDictionary alloc] init]; 과 같이 선언 하여 씁니다.

​간단히 문자열 "A" ~ "Z" 까지 실제 ASCII 코드값을 매칭 하는 샘플을 만들어 보겠습니다.


NSMutableDictionary *mapAlphaASCII = [[NSMutableDictionary alloc] init];
    
//값 할당.
for (NSInteger i = 65; i <= 90; i++)
{
    NSString *sKey;
    sKey = [NSString stringWithFormat:@"%c", (int)i];
    
    [mapAlphaASCII setValue:[NSNumber numberWithInteger:i] forKey:sKey];
}

//Key를 이용한 접근.
for (NSString *sKey in mapAlphaASCII)
{
    NSLog(@"Key[%@]=Value[%@]", sKey, [mapAlphaASCII objectForKey:sKey]);
}

//Enumerator 를 이용한 접근.
NSEnumerator *enmutor = [mapAlphaASCII objectEnumerator];
id oValue;
while (oValue = [enmutor nextObject])
{
    NSLog(@"Value[%@]", oValue);
}
< 위 코드는 XCode 11.2 Objective-C 에서 빌드 되었습니다 >

코드에서 염두하실것은 NSMutableDictionary 는 NSObject 를 상속받은 객체만을 멤버로 가질수 있습니다.

​일반적인 타입의 경우 멤버로 추가될수 없기 때문에 NSInteger 의 경우도 NSNumber 객체로 변환하여 멤버로 추가 되었습니다.

멤버를 접근 하는 방법은 Key 고속접근/Enumerator 를 이용하는 방법으로 구현 하였습니다.

NSMutableDictionary 관련 상세한 인터페이스는 https://developer.apple.com/documentation/foundation/nsmutabledictionary?language=objc 여기서 확인 하실수 있습니다.

​​제가 여기서 추가로 설명하고자 하는것은 제가 자주 사용하던 패턴과 사용함에 있어 필요로 생각하는 요소들만 정리해서 안내 해드리겠습니다.

a. setValue : NSMutableDictionary 에 멤버를 추가 해주는 메소드 입니다.
b. count : NSMutableDictionary 에 저장된 멤버에 대한 갯수를 리턴해주는 메소드 입니다.
c. removeAllObjects : NSMutableDictionary 에 저장된 멤버를 모두 지우는 메소드 입니다.
d. removeObjectForKey : NSMutableDictionary 에 저장된 멤버중 하나를 지우는 메소드 입니다.
e. objectForKey : 특정 키에 해당하는 값을 리턴합니다.

위 설명된 항목들을 활용한 샘플 코드를 만들어 보겠습니다.


NSMutableDictionary *mapAlphaASCII = [[NSMutableDictionary alloc] init];
    
//값 할당.
for (NSInteger i = 65; i <= 90; i++)
{
    NSString *sKey;
    sKey = [NSString stringWithFormat:@"%c", (int)i];
    
    [mapAlphaASCII setValue:[NSNumber numberWithInteger:i] forKey:sKey];
}

NSLog(@"mapAlphaASCII Member Count %ld", [mapAlphaASCII count]);

//Key를 이용한 접근.
for (NSString *sKey in mapAlphaASCII)
{
    NSLog(@"Key[%@]=Value[%@]", sKey, [mapAlphaASCII objectForKey:sKey]);
}

// B 값을 찾아 삭제.
if([mapAlphaASCII objectForKey:@"B"] != nil)
{
    [mapAlphaASCII removeObjectForKey:@"B"];
}
else
    NSLog(@"Not Found B");

NSLog(@"mapAlphaASCII Member Count %ld", [mapAlphaASCII count]);

//전체 멤버 삭제.
[mapAlphaASCII removeAllObjects];

NSLog(@"mapAlphaASCII Member Count %ld", [mapAlphaASCII count]);
NSMutableDictionary 의 기능은 제가 링크를 걸은 곳에서 더 많은 기능을 확인 하실수 있습니다.

2019년 11월 7일 목요일

Objective-C NSMutableArray 활용법

오늘 포스팅 할 내용은 Objective-C 에서 주로 쓰이는 NSMutalbeArray 활용법에 대한 강좌 입니다.

NSMutableArray 는 가변 리스트 배열을 관리 하는 클래스 입니다.

NSArray 는 멤버가 초기에 고정되어 있기 때문에 추가와 삭제를 자유롭게 하려면 NSMutableArray 를 사용 하셔야 합니다.
​
ARC 를 사용하는 환경에서
NSMutableArray* variable = [[NSMutableArray alloc] init]; 과 같이 선언 하여 씁니다.
​
간단히 1부터 100까지 변수를 추가하여 값을 출력하는 코드를 만들면서 멤버를 접근 하는 방법은 operator / objectAtIndex 을 이용하는 방법을 샘플에 적용하여 만들어 보겠습니다.

NSMutableArray* arrTest = [[NSMutableArray alloc] init];
    
for (NSInteger i=0; i<100; i++)
{
    [arrTest addObject:[NSNumber numberWithInteger:i]];
}

//operator 접근.
for (NSInteger i=0; i<[arrTest count]; i++)
{
    NSLog(@"operator arrTest[%ld]=[%@]", i, arrTest[i]);
}

//objectAtIndex 지시자 접근.
for (NSInteger i=0; i<[arrTest count]; i++)
{
    NSLog(@"objectAtIndex arrTest[%ld]=[%@]", i, [arrTest objectAtIndex:i]);
}

< 위 코드는 XCode 11.2 Objective-C 에서 빌드 되었습니다 >

코드에서 염두하실것은 NSMutableArray 는 NSObject 를 상속받은 객체만을 멤버로 가질수 있습니다.
일반적인 타입의 경우 멤버로 추가될수 없기 때문에 NSInteger 의 경우도 NSNumber 객체로 변환하여 멤버로 추가 되었습니다.

​NSMutableArray 관련 상세한 인터페이스는 https://developer.apple.com/documentation/foundation/nsmutablearray?language=objc 여기서 확인 하실수 있습니다.

제가 여기서 추가로 설명하고자 하는것은 제가 자주 사용하던 패턴과 사용함에 있어 필요로 생각하는 요소들만 정리해서 안내 해드리겠습니다.
​
​a. addObject : ​NSMutableArray 에 순차적으로 멤버를 추가 해주는 메소드 입니다. 위 샘플에서도 확인 하실수 있듯이 멤버에 대한 순차적 추가로 쓰실수 있습니다.
b. count : ​NSMutableArray 에 저장된 멤버에 대한 갯수를 리턴해주는 메소드 입니다.
c. removeAllObjects : ​NSMutableArray 에 저장된 멤버를 모두 지우는 메소드 입니다.
d. removeObjectAtIndex : ​NSMutableArray 에 저장된 멤버중 하나 지우는 메소드 입니다.
e. insertObject : ​NSMutableArray 에 멤버를 추가 할때 순서가 아닌 특정 위치에 추가 할수 있는 메소드 입니다.
f. objectAtIndex : index 를 이용하여 위치에 해당하는 멤버를 리턴합니다.
g. setObject : index 를 이용하여 위치에 해당하는 멤버를 변경합니다.
h. removeObject:inRange : 주어진 범위의 멤버를 삭제 합니다.

위 설명된 항목들을 활용한 샘플 코드를 만들어 보겠습니다.


NSMutableArray* arrTest = [[NSMutableArray alloc] init];
    
for (NSInteger i=0; i<100; i++)
{
    [arrTest addObject:[NSNumber numberWithInteger:i]];
}

//추가된 멤버의 갯수 출력.
NSLog(@"arrTest Count : %ld", [arrTest count]);

//20번쨰 위치에 200 엠버 추가.
[arrTest insertObject:[NSNumber numberWithInt:200] atIndex:20];
NSLog(@"arrTest Count : %ld, arrTest[20]=%@", [arrTest count], [arrTest objectAtIndex:20]);

//20번째 삽입한 200 멤버 제거.
[arrTest removeObjectAtIndex:20];

NSLog(@"arrTest Count : %ld, arrTest[20]=%@", [arrTest count], [arrTest objectAtIndex:20]);
    
//50 ~ 100 멤버 삭제.
[arrTest removeObjectsInRange:(NSRange){50, 50}];

NSLog(@"arrTest Count : %ld", [arrTest count]);
for (NSInteger i=0; i<[arrTest count]; i++)
{
    NSLog(@"arrTest[%ld]=[%@]", i, arrTest[i]);
}

//전체 멤버 삭제.
[arrTest removeAllObjects];

NSLog(@"arrTest Count : %ld", [arrTest count]);

NSMutableArray 의 기능은 제가 링크를 걸은 곳에서 더 많은 기능을 확인 하실수 있습니다.

구간 삭제는 50번째 부터 50개를 지운다는 의미 입니다.

2019년 9월 17일 화요일

iOS 13 WIFI SSID 구하기.

iOS Beta 가 조만간 정식 버젼으로 풀릴날도 얼마 남지 않았네요.
​

오늘은 기존에는 아무런 제약 없이 연결된 WIFI SSID를 구할수 있었는데 베타에서 얻을수 있는 방법에 대해서 알아 보겠습니다.
​
일단 XCode 11 Beta 와 iOS 13 Beta 가 설치 되어있어야 겠죠 ^^

샘플로 만들어진 프로젝트에 설정에

Capability 에
 Access WiFi Information 을 ON 해둡니다.
​
그리고 아래 함수 또는 기존에 만들어서 운영하던 함수도 상관 없어요.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
- (NSString*) updateWIFI
{
    NSString* strWifiSSID = @"";
 
    NSArray * ifs = (__bridge_transfer id)CNCopySupportedInterfaces();
    for (NSString* item in ifs)
    {
        NSLog(@"item = %@", item);
        NSDictionary * info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((CFStringRef)item);
        if (info == nil) continue;
        strWifiSSID = [info objectForKey:(NSString*)kCNNetworkInfoKeySSID];
        break;
    }
    
    return strWifiSSID;
}

위 함수를 호출하여 리턴되는 값을 출력 하시면 연결된 WIFI SSID를 얻으실수 있을겁니다.
그럼.. ^^

2016년 8월 22일 월요일

Declaration uses __weak but arc is disabled

기존에 빌드되던 코드였는데 XCode 업데이트 이후 손대지 않다가 빌드 할때 블러그 제목처럼에러가 날경우 있다.
해당 프로젝트에서 "Build Setting" 탭으로 가서 검색에 "weak" 로 검색을 하고 나서 아래화면과 같은 옵션에 빨간 동그라미를 체크 하고 빌드 하면 된다.

2016년 7월 16일 토요일

XCode 7.3.1 Font 설정창 버그 수정

XCode 7.3.1 을 새로 설치 하고 텍스트 개발 환경 새로 설정시 폰트를 O/S 에 설치된 다른 폰트로 설정 하고 싶은데 폰트의 종류가 몇개 나오지 않는 경우가 있다.
Apple Develop 사이트를 뒤져 보니 알려진 버그 인데 아직까지 수정이 되지 않은듯 하다.하여 찾아 본 결과 전체 폰트를 나올수 있게 수정하는 방법은 console 창을 띄워서 아래와 같은 명령어를 입력하면 된다.
defaults write -app Xcode NSFontPanelAttributes -string "1, 0"

명령어를 실행하기 전에 XCode를 닫아야 하므로 꼭 종료 시키고 실행 하시길..
위와 같이 하고 나면 폰트가 전체 나와서 설정할수 있다.
이런 기본적인 버그는 수정해서 좀 불편함이 없었으면 한다.. 애플사요..

2016년 5월 30일 월요일

Objective-C 문자열 Format String 쓰는 방법

오늘 포스팅 할 내용은 Objective-C Format String 에서 문자열 Format String 쓰는법입니다.

Objective C 도 C언어 방식으로 처리를 할수 있습니다 관련 내용은 제가 일전에 올려 놓은것을 확인하시고요
http://ansur.blogspot.kr/2015/10/cc-format-string.html

오늘은 CoCoa Frame 에서 제공하는 NSString 기준으로 처리 방법을 설명하겠습니다.

간단한 예로 10 이라는 값을 10자리로 앞에 비어있는 곳은 0으로 패딩하는법을 설명 드리겠습니다.

<예>
 // string 으로 format 을 활용하는 방법은 여러가지가 있으나 간단한 방법으로 접근 한다.
 NSString* strPaddingNum;

 strPaddingNum = [NSString stringWithFormat:@"%010d", 10];

 위와 같이 쓰면 결과는 $strPaddingNum 에  "0000000010" 와 같은 값이 들어 가게 됩니다.

 기본적은 프로그래밍 서적에 보시면 printf 에 매칭 되는 타입은 나와 있는데

 기본 타입과 Objective-C 에서 추가적인것과 틀린것들을 나열하겠습니다.

 %d => int 타입.
 %ld => long 타입.
 %s => 문자열 타입 (기본적인 문자열 char*)
 %@ => Objective-C 에서 관리되는 문자열
 %f => float, double
 %c => char
 %x => 16진수 소문자 형태로 출력.

2015년 9월 8일 화요일

Single Line Text Drawing

라벨 컨트롤을 오버라이딩 하여 처리 하는중 "drawAtPoint" 또는 "drawInRect" 함수를 이용하여 텍스트를 출력하여 처리 하는데 지정된 사각 영역에 텍스트를 출려하는중 텍스트가 지정된 영역보다 많을때 자동으로 줄바꿈이 일어났다. 원하는것은 그게 아닌데 ㅡㅡ.. 찾아 보던중 싱글 라인을 지정하는 옵션은 없구 텍스트 DrawMode 를 변경 해줘야 하는걸 알았다. CGContextSetTextDrawingMode(context, kCGTextFillClip); 위와 같이 텍스트를 그리기전에 모드를 변경 해줘야 싱글 라인으로 출력이 가능하다. 뒤에 옵션은 소스를 따라가보면 여러가지 옵션을 볼수 있으므로 원하는 옵션으로 처리를 하면 끝..

2015년 2월 9일 월요일

Objective-C 기준 스트링 검색/추출/분리(Find/SubString/Split)

오늘 포스팅 할 내용은 Objective-C 환경에서 스트링 검색/추출/분리 작업에 대해서 이야기 합니다.

프로그램을 만들다 보면 스트링 핸들링은 중요한 항목중에 하나이고 뭐 대충 검색 해보면 많은곳에서 가이드 하고 있습니다.

그래도 샘플을 찾다 보면 내가 제시한 샘플을 찾고 자 하는 사람들을 위해서 ^^

일단 선행 조건은 특정 디렉토리에 파일이 있을경우 파일명만 찾아서 추출하고 과정과 디렉토리 를 "\\" 문자로 분리 하는 과정을

소개 합니다.

NSString* strOrgPath = @"C:\\Temp\\Dummy.txt";
NSString* strOnlyFileName = @"";

// 파일을 분리 하기 위한 Reverse Find
NSRange rangeFind = [strOrgPath rangeOfString:@"\\" options:NSBackwardsSearch];

// 파일 이름 분리 작업
if (rangeFind.location != NSNotFound 0)
{
    strOnlyFileName = [strOrgPath substringWithRange:NSMakeRange(rangeFind.location+1, [strOrgPath length]-(rangeFind.location+1))];
    NSLog(@"%@", strOnlyFileName);
}

//디렉토리를 "\\" 로 분리 하는 작업
NSArray* sArrSplitPath = [strOrgPath componentsSeparatedByString:@"\\"];

for (NSString* sItem in sArrSplitPath)
{
    NSLog(@"%@", sItem);
}

여기까지 ^^;