콘텐츠로 건너뛰기
Home » Development » Objective-C » Page 4

Objective-C

Swift – Interacting with C Pointers

https://developer.apple.com/swift/blog/?id=6

Objective-C 및 C의 API들은 종종 포인터를 사용한다. Swift의 데이터 타입들은 포인터 기반의 Cocoa API들과 자연스럽게 어울리도록 디자인되었고, Swift는 포인터를 파라미터로 일부 다루고 있다.

포인터와 in/out 파라미터

C와 Objective-C의 함수는 복수의 값을 리턴하지 못하기 때문에 부가정보를 함수 외부로 내보내기 위해서 포인터를 사용한다. Swift는 이런 경우 inout 어트리뷰트를 가진 파라미터를 정의할 수 있어서 Swift에서는 & 문법을 사용하여 var 변수의 포인터를 넘겨줄 수 있다. 예를 들어 UIColorgetRed(_:green:blue:alpha:) 메소드는 4개의 CGFloat* 포인터를 받는데 이는 다음과 같이 사용하여 4개의 변수에 대해 각 컬러 값을 얻어낼 수 있다.더 보기 »Swift – Interacting with C Pointers

Objective-C 래퍼를 통해 Swift에서 SQLite3를 사용하는 법

이 글에서는 Objective-C로 SQLite3 데이터베이스에 액세스하는 API를 래핑한 간단한 클래스를 작성해보겠다. 사실 Objective-C로 SQLite3를 사용하는 것은 C API를 그대로 사용하면 되는 부분인데, 이렇게 래퍼를 만들면 브릿징헤더만 작성해주면 래퍼 클래스를 Swift에서 그대로 사용할 수 있게 되기 때문에 좀 더 쉽게 사용할 수 있다.

Swift에서 C헤더를 바로 반입할 수 있기 때문에 이 방식은 오히려 번거로울 수 있다. (특히 스펙이 약간만 변경되어도 Objective-C 클래스를 수정해야 한다.) 선택은 각자가 알아서 하시면 되겠다.

더 보기 »Objective-C 래퍼를 통해 Swift에서 SQLite3를 사용하는 법

tableview 셀 생성

테이블 뷰의 데이터소스 프로토콜에는 -tableView:cellForRowAtIndexPath: 라는 메소드가 있다. 이 메소드는 테이블 뷰 상의 특정 위치에 들어갈 cell 객체를 알려주는 메소드로 프로그래머가 작성해주어야 하는 부분이다. 일반적으로는 이렇게 작성했다.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    const NSString *reuseID = @"cell";
    UITableViewCell *cell = [tableView dequeReusableCellWithIdentifier:reuseID];
    if (cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseID];
    }
    ...
    return cell;
}

더 보기 »tableview 셀 생성

Hash Map 이란 무엇인가

해싱

이진 트리 탐색에서는 리스트의 값이 순서대로 정렬되어 있다는 점을 활용하여 로가디즘시간(리스트의 크기가 커지면 탐색 시간이 리스트 크기의 로그값만큼 증가하는)에서 탐색이 이루어지도록 탐색 성능을 개선시킬 수 있음을 보았다. 이 장에서는 보다 나아가 고정시간이 걸리는 탐색을 살펴보고자 한다. 이 컨셉은 “해싱”이라는 기법으로 불린다.
이를 사용하기 위해서는 리스트에서 원소가 어디쯤에 위치할 것인지에 대해 좀 더 많은 것을 알아야 한다. 만약 모든 원소가 있어야 할 위치에 있다면 단 한 번의 비교 만으로도 아이템을 찾을 수 있다. 더 보기 »Hash Map 이란 무엇인가

싱글톤

싱글톤은 SharedInstance라는 명목으로 코코아 내에서도 상당히 자주 쓰이는 패턴이다. SharedApplication이나 NSFileManager, NSNotificationCenter 등에서 많이 활용된다. 쉽게 생각하면 다음과 같은 식으로 구현하면 될 것이라 보는데…

static SomeClass *sharedObject;
+ (SomeClass *)sharedInstance {
    if (sharedObject == nil) {
        sharedObject = [[self alloc] init];
    }
    return sharedObject;
}

더 보기 »싱글톤

IBOutlet

IBAction / IBOutlet / IBOutletCollection

프로그래밍 언어에서는 종종 필수 지시어가 사람에게는 별 의미 없는 것이 되곤 한다. 오브젝티브 C에서는 #pragma 디렉티브, 메소드 타입 인코딩같은 것들이나 기본적인 저장 클래스는 기본적으로 의미가 없는 것으로 보이며, 실제로 컴파일러가 똑똑해지면서 그 의미가 퇴색된다. 그럼에도 불구하고 이러한 것들은 코드 그 자체가 다른 개발자에게 힌트를 줄 수 있는 수단이 되기도 한다.
이제 막 코코아나 코코아터치를 시작한 개발자에게 IBAction, IBOultet, IBOutletCollection과 같은 매크로는 이러한 현상의 일부이다.
다른 두글자 접두어들과는 달리 IB-라는 접두어는 시스템 프레임워크와는 아무런 상관이 없고 그저 인터페이스 빌더와 관련이 있는 말이다. 인터페이스 빌더는 오브젝티브 C의 초창기에 그 근원을 두고 있는데, 88년에 “프로젝트 빌더”는 “NeXTSTEP 개발 도구”로 발전하였고, Xcode에 이르기까지 그 구조가 크게 바뀌지 않았다. 아마 요즘의 iOS 개발자들도 NeXTSTEP 워크스테이션을 접해보면 컨트롤들을 뷰에 끌어다 놓는 이 환경이 익숙하게 느껴질 것이다. 더 보기 »IBOutlet

Swift Tour ​

A Swift Tour

이 글은 애플의 The Swift Programming Language의 서두에 해당하는 챕터를 간략히 요약했다. 이 책의 웹 버전은은 이 곳에서 확인할 수 있다.

전통에 따라 Hello World를 찍어보자.

println("Hello, world")

스위프트에서 이 코드 한 줄은 그 자체로 완전한 프로그램이다. 별도의 헤더 반입이나 보일러 플레이트가 없다. 전역적으로 작성된 코드는 곧장 프로그램의 진입점(entry point)이 된다. 따라서 별도의 main 함수를 작성할 필요는 없다. 또한, 한 라인에 한 구문씩 작성하는 경우 라인의 끝에는 세미콜론을 따로 붙이지 않아도 된다.더 보기 »Swift Tour ​

instance type

Objective-C는 (논란의 여지는 있지만) 지금도 급속히 발전하고 있는 언어이다. ARC, 오브젝트 리터럴, 서브스크립팅, 블럭과 같은 기능들이 최근 몇 년 사이에 추가되었고, 이런 것들은 프로그래밍 방식 자체를 바꾸고 있다. 이런 모든 혁신은 애플의 수직 통합의 철학이 내놓은 결과물이다. 애플이 칩 디자인에 공을들여 하드웨어에 있어서 공격적인 경젱을 할 수 있게 된 것 만큼이나, 그들은 LLVM에 투자하여 페이스를 맞추고 있다.
alloc이나 init과 같은 생성 메소드들은 모두 id 타입의 객체를 내놓지만, Xcode는 이런 객체들에 대한 타입체크를 제대로 하고 있다. 어떻게? 코코아에서 alloc이나 init이라는 단어가 들어간 메소들은 모두 수신자 클래스의 인스턴스 객체를 내놓는다. 즉, 수신자와 연관된 타입을 리턴한다는 것이다. 대신에 클래스의 컨스트럭터 메소드들은 이러한 타입체킹을 하지 않는다. 즉, alloc, init에 의한 리턴 객체들만 이것이 가능하다.
더 보기 »instance type