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

Objective-C

(Swift) 에러 핸들링 기법

에러 핸들링은 프로그램 내에서 에러가 발생한 상황에 대해 대응하고 이를 복구하는 과정이다. Swift는 에러를 던지고, 캐치하고, 이전하며 조작할 수 있는 기능을 언어의 기본 기능으로 지원한다.
어떤 동작들은 항상 유용한 결과를 내놓거나 완전하게 실행되는 것이 보장되지 않는다. 결과가 없는 경우에 이를 표현할 수 있는 옵셔널 타입을 사용할 수도 있지만, 처리 자체가 실패하는 경우, 어떤 원인으로 실패하였는지를 알면 코드가 이에 적절히 대응할 수 있도록 할 수 있기에 그 원인을 하는 것은 유용하다.
예를 들어 디스크상의 파일로부터 데이터를 읽고 처리하는 작업을 생각해보자. 여기에는 작업이 실패할 수 있는 경우가 꽤 많다. 주어진 경로에 파일이 존재하지 않거나, 파일을 읽을 수 있는 권한이 없거나 혹은 파일이 호환되는 포맷으로 인코딩 되어 있지 않을 수도 있다. 이런 상황들을 구분하는 것은 프로그램으로 하여금 에러를 스스로 해결하거나, 자동으로 해결할 수 없는 에러에 대해서 사용자에게 보고할 수 있게끔 한다.더 보기 »(Swift) 에러 핸들링 기법

gcd in swift3

GCD in Swift3 iOS/OSX에서 동시성을 처리하기 위해서는 NSThread로부터 NSOpaerationQueue에 이르는 방법이 있었고, 시스템 레벨에서 모든 걸 관리해주는 GCD가 나오기에 이르렀다. 하지만 GCD는 libdispatch의 API를 그대로 사용했기 때문에 Swift에서는 가장 번거로운 문법을 이용해야 했었으나, Swift3에서 API를 전면적으로 개선했다. dispatch_async 이전에는 동기/비동기 여부를 결정한 후 어떤 큐를 쓸 것인지를 결정하는 순서로 코드가 작성되었는데, 이제는 이 순서가 바뀌었다. 왜냐면 dispatch_async, dispatch_sync는 자유함수에서 큐의 메소드로 편입되었기 때문이다. DispatchQueue.global(attributes:[.qosDefault]).async { // 백그라운드 작업 DispatchQueue.main.async(execute: { /* … */ }) } 큐의 속성은 생성시점에 지정될 수… 더 보기 »gcd in swift3

TableView for OSX

OSX의 테이블뷰 사용법

iOS의 테이블과 달리, OSX의 테이블뷰는 행과 열이 모두 존재하는 애트리뷰트들을 가진 레코드들의 집합을 표시하는 테이블이다. 예를 들어 종업원들의 명부를 표시하는 테이블 뷰는 성, 이름, 지점명의 각각의 칼럼을 가진 테이블을 표시하게 된다.
테이블 뷰는 하나 혹은 그 이상의 칼럼을 가질 수 있으며 횡방향, 종방향으로 스크롤 되고, 선택 영역을 가질 수 있고, 칼럼의 드래깅을 지원한다. 각각의 행은 데이터 집합 내에서 대응하는 하나 이상의 셀을 포함한다.

이 문서에서 은 테이블 내 실제 칸 하나를 의미한다. 셀을 나타내는 NSCell 혹은 그 서브 클래스는 필요하면 클래스명으로 직접 언급한다.

더 보기 »TableView for OSX

(Swift) iOS, OSX에서 이미지 저장하기

이미지를 저장하기

이미지를 JPEG, PNG 데이터로 만드는 것은 UIKit의 표준함수를 이용할 수 있다.

func UIImageJPEGRepresentation(_ image: UIImage!, _ compressionQuality: CGFloat) -> NSData!
func UIImagePNGRepresentation(_ image:UIImage!) -> NSData!

이를 이용해서 데이터를 저장할 수 있다. NSData로 만들어서 그냥 저장하면 되니까.

func saveImage(image: UIImage, toURL url: NSURL, withFormat format:ImageSavingFormat = .PNG) {
    let data: NSData
    switch format {
    case .PNG:
        data = UIImagePNGRepresentation(image)
    case .JPEG:
        data = UIImageJPEGRepresentation(image, 1.0)
    }
    var error: NSError?
    data.writeToURL(url, atomically: false, error: &error)
    if error != nil {
        println("Fail to save image")
    } else {
        println("successfully saved.")
    }
}

더 보기 »(Swift) iOS, OSX에서 이미지 저장하기

난수생성을 위한 조금 더 나은 선택 – arc4random

전통적인 C 함수로 srandom, rand를 이용해서 난수를 생성하는 방법이 있는데, 보다 진보된(?)형태의 함수로 arc4random 함수가 있다. 이 역시 표준 C 라이브러리(libc)에 탑재되어 있다. (GCC 버전 요구사양은 잘 모르겠다.)

u_int32_t arc4random(void);

이 함수는 32비트 범위값 내에서 정수의 형태로 난수를 생성하며, rand(), randome() 함수에 비해 두 배의 범위를 가진다. 게다가 seed 값을 미리 정의해줄 필요도 없다.

더 보기 »난수생성을 위한 조금 더 나은 선택 – arc4random

코코아바인딩 :: 컨트롤러의 컨텐츠 제공방법

컨트롤러 컨텐츠를 제공하기

컨트롤러들은 (당연히도) 관리할 컨텐츠가 필요하며, 컨텐츠를 지정하는 방법에는 여러가지가 있다. 바인딩을 생성하는 코드를 통해서도 가능하며, IB를 통해서도 설정할 수 있다.

컨트롤러 컨텐츠 설정하기

NSObjectController와 그 서브클래스들은 -initWithContent:를 통해서 초기화되며, 만약 컨텐츠 바인딩을 의도한다면 nil을 넘겨도 된다. 혹은 명시적으로 setContent:를 통해서 지정해줄 수도 있다. 보통은 컨트롤러의 컨텐츠 바인딩을 통해서 연결하는 것이 일반적이다.더 보기 »코코아바인딩 :: 컨트롤러의 컨텐츠 제공방법

코코아 바인딩이 동작하는 방식

코코아 바인딩은 뷰와 데이터 모델을 양방향으로 “묶어서(binding)” 한쪽에서의 변경이 다른쪽으로 자동으로 반영되게끔 하는 것이다. 예를 들어 슬라이더를 드래그하여 값을 변경한 것을 뷰 컨트롤러의 특정한 실수값 프로퍼티에 반영하도록 하거나, 혹은 클래스외부로부터 전달받은 메시지에 의해서 프로퍼티 값이 변경된 경우, 자동으로 이 값이 뷰에 반영되도록 하는 것이다. 이러한 기능은 코코아 바인딩을 쓰지 않고도 얼마든지 구현할 수 있지만, 코코아 바인딩을 사용하게 되면 많은 양의 “접합 코드”들을 작성하는 것을 생략할 수 있다. 예를 들어 다음과 같은 부분에 대한 코드를 일일이 작성해야 한다. 데이터의 변경을 업데이트해… 더 보기 »코코아 바인딩이 동작하는 방식

NSGraphicsContext로부터 CGContextRef 얻기

아직 문서화가 안됐는데, NSGraphicsContext 객체로부터 CGContextRef 객체를 얻기 위해서 이전에는 -graphicsPort를 이용했는데, 이 프로퍼티는 deprecated되었고, (10.9 이상) 현재는 CGContext 프로퍼티를 쓴다. 헤더에만 나와있으니 참고

NSArrayController explained

배열 컨트롤러 배열 컨트롤러는 일련의 객체 집합을 다루는 바인딩 호환 객체이다. 여기서 ‘집합’은 주로 NSArray인데, 코어데이터 등에서는 NSSet을 쓰기도 한다. 배열 컨트롤러는 배열이 아니고 별도의 배열을 관리한다. 이는 배열을 자동으로 재정렬하거나, 선택된 객체들을 기억하거나 하는 배열 자체에 저장될 수 없는 몇 가지 메타 정보를 가지고 배열을 다루는 것을 도와준다. 배열 컨트롤러는 NSObjectController의 서브클래스로, 다음 메소드를 통해서 초기화할 수 있다. – (instancetype)initWithContent:(id)content 다시 NSObjectController는 NSController의 자손인데, 이 컨트롤러는 객체의 편집 과정에 따른 이벤트를 발생시키는 기능을 갖고 있다. -objectDidBeginEditing: -objectDidEndEditing: -commitEditing -commitEditingWithDelegate:didCommitSelector:contextInfo:… 더 보기 »NSArrayController explained

코코아 바인딩이란

코코아 바인딩

기능적인 측면에서 가장 단순하게 설명하면, 코코아 바인딩은 모델과 뷰 사이에 어떠한 글루코드 없이 값과 디스플레이되는 것을 동기화시키는 것이다. 즉 바인딩을 구성하면 코드상에서 어떤 프로퍼티의 값이 변경될 때 별도의 업데이트 코드를 작성하지 않더라도 자동으로 뷰가 업데이트되고, 반대로 뷰에서 사용자가 값을 조작하는 이벤트가 발생하면 역시 아무런 코드가 없더라도 연결된 프로퍼티 값이 변경되게 하는 것이다.

코코아 바인딩은 코코아의 기본 기술들을 결합하여 구현되는데, 작성/유지해야 하는 코드의 양을 최소화하면서 뷰와 모델간의 바인딩을 거의 공짜로 제공한다. 클래스를 작성할 때, 키밸류 컨벤션만 따랐다면, 코코아 바인딩을 적용하기 위해서 기존 코드를 재작성할 필요도 없다.

더 보기 »코코아 바인딩이란