2017년 3월 28일 화요일

Swift 3.1 릴리즈

오늘 Xcode 8.3 이 정식으로 릴리즈 되면서 Swift 3.1 도 함께 정식 릴리즈 되었다. 그래서 변화점을 간략히 정리해 보려고 한다. 주관적(?)으로 정리할 것이기 때문에 정확한 내용은 영어 울렁증(?)이 없다면 공식 사이트의 릴리즈 노트 를 보는 것이 좋을지도 모른다.

2017년 3월 21일 화요일

Notification Snippets

복잡한 뷰 컨트롤러들을 다루면서 여기 저기 소속된 데이터를 다루려고 할 때 소유권 때문에 곤란함을 느낄 때가 많았다. 이럴 때 NotificationCenter 를 이용해 알림(Notification)을 던지는 방식으로 컨트롤러 객체들끼리 통신을 하기도 하는데, 뭐 하여간 이런 저런 여러 사유로 노티피케이션(Notification 혹은 NSNotification)을 사용할 일이 종종 있다.

하지만 항상 쓸 때 마다 느끼는데, 이 알림(Notification)의 이름(Name)을 찾는데 곤혹을 느끼곤 한다. 왜나하면 한군데에 정리된 것이 아닌 전역 상수 형태로 선언된 것이 대부분이기 때문이다.

물론 개인이 구현하는 프로젝트에서 쓸 Notification 은 굳이 이런 전통을 따를 필요는 없다. 누구나 한번 쯤은 해 볼 만한 Notification Snippets 를 한번 만들어 보자.

2017년 2월 28일 화요일

CATransition Animation (Core Animation)

레이어 이야기를 쓰다가 계속 삼천포로 살짝 빠지는 느낌이 들지만, 이번 글은 레이어 트랜지션(Transition), 즉 장면전환 애니메이션에 관한 글이다.

2017년 2월 21일 화요일

CALayer Animation (Core Animation)

CALayer 에 관한 글을 적으면서 애니메이션에 대해 언급할 필요가 생겼는데 간략히 하기에는 양이 너무 많은 것 같다. 그래서 이번엔 CALayer 애니메이션에 관한 것을 별도로 정리하려고 한다.

CALayer 의 이름에서 볼 수 있는 머릿글자 CA 는 Core Animation 의 약자이다. Quartzcore 라는 거대한 시스템의 일부이기도 한 이 Core Animation 은 레이어 애니메이션을 위한 기능들로 구성되어 있다.

전체를 설명하기에는 양의 방대함도 그렇고 개인적인 지식도 문제가 되기 때문에 애니메이션과 관련된 Quartzcore 의 몇 클래스만을 정리해 본다.

2017년 2월 15일 수요일

CALayer - CAShapeLayer

CAShapeLayer 는 Shape 를 그리기 위한 CALayer 기반 클래스이다. 다르게 말하면 다각형 혹은 폴리곤을 그리기 위한 용도라고 볼 수 있다.

2017년 2월 13일 월요일

2017년 2월 8일 수요일

CALayer - CATextLayer

CATextLayer 는 그 이름처럼 화면에 글자를 그리기 위한 용도의 CALayer 기반 레이어 클래스이다. UILabel 이나 NSTextField 등에 비해 기능적인 면에서 부실하기는 하지만 아무래도 퍼포먼스 면에서는 우위일 것이다.

2017년 2월 7일 화요일

CALayer 시작하기

지금까지 iOS 및 macOS 용 앱을 여럿 만들어 왔지만 레이어에 대해서는 자세히 공부해 본 적이 없었다. 블로그에 글 쓸 주제도 적어지고 마침 필요도 하기에 레이어에 대해 공부해 보면서 알게 된 것들을 정리해 보려고 한다.

2017년 2월 1일 수요일

NSScrollView Cheatsheet

개인적으로 NSScrollView 를 이용하면서 알게된 팁을 모아본 글이다. 이 글은 계속 업데이트 될 수 있다.

2017년 1월 20일 금요일

Swift 속의 C Pointer 이야기 - 기타 도구들

이 글은 포인터에 관련이 있거나 간접적인 접근 방법에 대한 글이다.

Swift 속의 C Pointer 이야기 - UnsafeBufferPointer, UnsafeMutableBufferPointer

버퍼(Buffer)라는 용어는 대체로 연속적인 메모리 공간을 의미한다. 메모리를 할당해서 구한 포인터는 이 버퍼의 시작 주소를 담고 있다고 볼 수 있다. 버퍼는 메모리 덩어리 그 자체다.

하지만 스위프트(Swift)는 포인터를 쓸 수 있는 언어가 아니기 때문에 연속적인 메모리를 액세스 하는 것이 불가능하다. 그래서 위의 버퍼 개념이 맞지 않는다.

Swift 에서는 버퍼를 대체하기 위해 배열(Array)을 대신 사용한다. 랜덤 액세스도 되고 이터레이션도 되는 그 배열 말이다.

UnsafeBufferPointer 와 UnsafeMutableBufferPointer 는 이런 Swift 버퍼와 C 버퍼 사이의 상호호환을 위해 제공되는 특수한 컨테이너다.

Swift 속의 C Pointer 이야기 - UnsafeRawPointer, UnsafeMutableRawPointer

이번 이야기는 Raw Pointer 대충 번역하면 생포인터에 대한 이야기다. 쉽게 표현하자면 이 생포인터는 타입이 지정되지 않은(Untyped) 포인터이다. 포인터 시작편에서 언급했지만 이 생포인터는 타입이 명시되지 않았다는 점 때문에 Swift 에서 배척(?)받을 지도 모르는 존재일지도 모르겠다. (뇌내망상)

이 생짜포인터를 액세스 하기 위해 Swift 에서는 UnsafeRawPointer 와 UnsafeMutableRawPointer 등의 컨테이너를 제공한다.

Swift 속의 C Pointer 이야기 - UnsafePointer, UnsafeMutablePointer

UnsafeMutablePointer 는 지정된 타입의 포인터를 다루는 가장 일반적인 컨테이너이다. Mutable 이라는 이름에서 유추가 가능하겠지만, 이 포인터 컨테이너는 포인터가 가리키는 메모리를 조작(?)할 수 있는 녀석이다.

Swift 속의 C Pointer 이야기 - 시작

Swift 에서 C 포인터(Pointer)는 왜 쓰는가. 모호할 때도 있고 쓰기도 귀찮고 문제도 자주 일으키는 그 개념을 말이다.

그런데 답은 C 포인터 라는 이름에서 이미 나와있다. 당연히 C로 구현된 함수가 포인터를 사용하게 되니 이 함수를 쓰려면 포인터를 다뤄야 한다는 것이다.

C 가 점점 대중(?)들에게 잊혀져 가는 현재로썬 포인터는 거의 쓸 일이 없어졌다고 볼 수도 있다. 하지만 동일개념을 사용하는 C++도 아직 현역이고 암호화 등 바이너리 연산 계통에선 여전히 C가 현역이다. 거기에 포인터도 거의 따라나니다 보니 아직은 땔 수 없는 애증(?)의 관계인 것 같다.

이번 글은 예전에 썼던 포인터 글이 오래된 것 같아 새롭게 Swift 3 기준으로 C 포인터에 대해서 작성해 본다.

2017년 1월 10일 화요일

UserDefaults (NSUserDefaults) 에 대한 소소한 이야기

UserDefaults (Objective-C 에서는 NSUserDefaults) 는 대체로 앱의 설정 값을 저장하고 나중에 읽기 위한 용도로 종종 사용된다. 별도의 파일이나 데이터베이스 엑세스 없이 쓸 수 있다. 굉장히 쉽고 다방면에 활용되어서 글로 정리하는게 피곤한(?) 일이 될 정도인데, 개인적으로 궁금해서 찾아본 몇 가지 정보를 더해서 글로 정리해 본다.

2017년 1월 6일 금요일

Objective-C 코드의 Swift 별명 이야기 (Swift 3 기준)

편의성 측면도 있겠지만 애플에서 Swift 를 강력하게 밀고 있기에 아무래도 macOS나 iOS용 개발 언어는 Swift 가 주류가 될 가능성이 높다. 하지만 그렇더라도 한동안은 Objective-C 와의 동거를 끝낼 수는 없을 것이다. 그 증거로 애플에서는 Xcode 나 Swift 가 업데이트 될 때 마다 Objective-C 코드와의 공존에 대한 기능을 계속 발전시키고 있다.

이번 글은 Objective-C 코드가 Swift 에서 어떻게 읽혀지는지 혹은 Swift 용 별명을 지어서 언어간 차이를 완화시키는 방법이 있는지를 간단히(?) 적어볼까 한다.

2017년 1월 5일 목요일

Swift Documentation - 스위프트 코드 기반 문서화 예제들

앞서 살펴본 내용에서 소스 코드 문서화의 기초적인(것 같지만 거의 대부분인 -_-) 내용을 살펴 봤다. 이번 글에서는 좀 더 다양한 예제를 통해 어떻게 하면 문서화가 되는지를 간략히 살펴보자.

2017년 1월 4일 수요일

Swift Documentation - 스위프트 코드 기반 문서화

제목을 뭘로 표현하면 좋을까 고민했는데 최대한 직설적으로 적었다. 이번 주제는 코드 자동 문서화인데 별도의 레퍼런스 매뉴얼로 만들어 내는 것 보다는 Xcode 내에서 참조 할 때 표시되는 도움말 팝업 위주이다.

2016년 11월 29일 화요일

[macOS] 개발중인 앱에서 키보드를 눌렀을 때 에러음(Beep)이 들리는 경우

macOS 용 앱에서 '드앵~' 이라고 들리는 에러비프음(Beep, NSBeep)이 들리는 경우는 대체로 사용자가 잘못된 동작을 하는 경우이다. 물론 이 경우 이런 소리가 들리는 건 맞겠지만, 앱에서 의도한 기능의 단축키를 NSView 가 아닌 NSEvent 의 local monitor 형태로 구현했다거나 혹은 다른 사정으로 소리가 안울리길 원할 수도 있다. 의도한 기능의 키를 누르면 시도 때도 없이 울리는 에러음이 좋을 리는 없다.

그렇다면 어떻게 하면 이 에러음을 잡을 수 있을까? 개인적으론 세 가지 요소가 필요하다고 본다. 다른 더 좋은 방법이 있을지도 모르겠지만 관련 자료가 부실(?)해서 삽질로 알아낸 내용임을 감안하자.

2016년 11월 23일 수요일

2016년 11월 15일 화요일

[macOS] 광역(?) 마우스 및 키보드 이벤트 인식

제목이 약간의 오해가 있을 수도 있어서 좀 더 자세히 적어보자면, 앱 내부의 마우스나 키 입력을 받는게 아니라 앱 윈도우에 포커스가 없는 상태에서 마우스나 키보드 이벤트를 받기 위한 내용이다. 흔히 쓰이는 윈도우의 '키보드 후킹'이라는 표현이 많이 비슷하기도 하다.

2016년 11월 10일 목요일

[macOS] 라이언 스타일 풀스크린 지원

풀스크린에 대한 글을 써 보려 했는데 사실 쓸 내용이 없다. 이제 모든 앱 프로젝트는 기본적으로 라이언 스타일 풀스크린이 기본 옵션이다.

... ?!! 응? 뭐? 끝이야?!

물론 이 글을 뜬금없이 끝낼 순 없으니 한가지 팁을 소개해 본다.

만약 윈도우가 툴바를 가지고 있다면, 그리고 풀스크린 환경에서 툴바를 숨기고 싶은 경우가 있을 수 있다. 예를 들어, 사파리는 풀스크린을 표시하면 메뉴바만 사라지는데, 사진(Photos)앱은 뷰어 모드에서는 툴바가 메뉴바와 동일하게 표시되지 않다가 마우스 커서를 상단에 가져가야 나타난다.

2016년 11월 8일 화요일

[Xcode] 비동기 루틴 유닛 테스트 (Asynchronous Unittest)

Xcode 의 유닛테스트 기능은 동기(Sync)코드 테스트에 최적화 되어있다. 당연하게도 비동기 루틴의 경우 해당 테스트 컨텍스트가 종료된 뒤에 비동기 결과가 들어오니 쉽게 판단할 수는 없을 것이다.

다행히도 Xcode 의 XCTest 모듈은 이런 비동기 콜(Asynchronous Call)에 대비하기 위한 약간의(?) 기능이 제공되고 있어서 소개해 본다.

2016년 10월 27일 목요일

우연히 발견한 macOS 10.12 NSAlert 버그(?) 삽질기

macOS 10.12 시에라가 업데이트 된 후로 개발 중이던 맥 앱에서 DETECTED_MISSING_CONSTRAINTS 예외가 발생하는 상황을 겪었다. 물론 10.11 에서 개발할 당시에는 잘 돌아가던 앱이었는데 10.12 부터 이런 오류가 발생하기 시작했다.

다행인 점은 죽지는 않고 경고 수준으로 끝나는 오류였다는 점이다. 사람마다 느끼는 점은 다르겠지만, 나에겐 찝찝함을 남기는 메시지가 떴기에 그냥 넘길 수가 없었다.

2016년 9월 27일 화요일

2016년 9월 20일 화요일

Xcode 8 GM 으로 겪어보는 Swift 3 의 변화들 #2

Xcode 8이 드디어 베타 딱지를 떼고 GM 마크를 박고 올라왔다. 이제 기능 면에서 바뀔 일은 없을 것 같으니 마지막으로 마무리 하는 겸으로 무엇이 바뀌었는지에 대한 경험담을 이어서 적어본다.

이 글은 'Xcode 8 Beta 로 겪어보는 Swift 3 의 변화들' 글에서 정리한 내용을 제외하고 GM 버전에서 추가로 발견한 사항들을 정리한다.

이 글을 올리는 오늘 Xcode 8 이 정식 릴리즈 되었다는 것은 참 거시기하다

2016년 9월 13일 화요일

릴리즈 모드로 빌드한 앱이 죽는다

이 글은 튜토리얼이나 API소개글이 아니라 실제로 겪었던 일을 토로(?)하기 위한 글이다. 내용은 제목 처럼 릴리즈 모드로 빌드한 앱을 돌려보면 죽는다는 것이고 이를 해결하기 위해 거친 고난과 해결법에 대해 소개한다.

2016년 9월 6일 화요일

[Cocoa] 타이틀바는 없지만 툴바에 표준 버튼이 있는 윈도우 만들기

뭔가 제목이 좀 복잡한 감이 있는데, 영문으로 적으면 Unified Title and Toolbar 라는 형식의 윈도우를 만드는 방법에 대한 글이다. 내용 자체는 매우 간단한데 이번엔 영상으로 (콩글리쉬와 함께 -_-) 만들어봤다.

2016년 8월 9일 화요일

NSPopover Cheatsheet

NSPopover는 말풍선 모양의 팝업윈도우 컴포넌트이다. 미려한(?) UI를 구성하는데 필수적이기 때문에 정리해 본다.


2016년 7월 21일 목요일

[Objective-C] Block Syntax 초간단정리

하도 잊어먹어서 - 거기다 요즘은 Swift만 써대다보니 더욱 더 잊어먹어서 - Objective-C 블럭 문법(Block Syntax)을 자주 쓰는 것들 위주로 예제와 함께 정리해본다.

2016년 7월 20일 수요일

Xcode 8 Beta 로 겪어보는 Swift 3 의 변화들

지금까지는 Xcode 의 각 베타가 나올 때 마다 변화점들을 기록하곤 했는데, Swift 가 오픈소스화 된 지금은 이런 변화를 매번 캐치할 필요는 없을 것 같다. 무엇보다, Swift 문법(Syntax) 자체의 변화를 정리할 필요도 없이 아래 사이트를 보면 Swift 3 의 변화점을 알 수 있다.

https://swift.org/blog/swift-3-0-preview-1-released/

3.0 의 변경점은 더 이상 일어나지 않고 이제 4.0 을 개발한다고 선언까지 된 상태이니 이제 기정사실이 된 변화점들이다.

이렇게 정리가 잘 된(?) 글들이 있으니 이제 내가 할 일은 그냥 체감하는 것 뿐인것 같다. 그래서 실제로 체감(?)해 보고 느낀 것들을 정리해 본다. 물론 이번 글이 전부는 아니겠지만...

2016년 7월 19일 화요일

NSTask 와 NSPipe 를 이용해 쉘 커맨드 실행시켜서 결과 얻어오기

과연 이 내용이 현대(?)시대에 필요할지에 대해서 의문이 있을지도 모르겠지만 아직까지는 터미널 유틸리티의 특수성(?) 때문에 종종 쓰이고 있다고 생각된다. 그래서 이에 대해 정리해 본다.

2016년 5월 31일 화요일

NSView Cheatsheet

기존 NSView에 관한 잡지식(?)과 기존 글들을 한데 모은 글이다. 이 글은 지속적으로 업데이트 된다.

2016년 5월 20일 금요일

Container View Cheatsheet

컨테이너 뷰(Container View)는 별도의 클래스가 아니라  그냥 NSView 타입이다. 단지 인터페이스 빌더에서 이런 이름으로 특수하게 제공되는 기능 중 하나이다. 이 글의 내용은 개인적인 문제 해결 기록을 정리한 것이다.

2016년 5월 19일 목요일

NSSplitView and NSSplitViewController Cheatsheet

NSSplitView 그리고 NSSplitViewController를 사용하면서 겪거나 필요한 내용을 정리한다. 기본적으로 NSSplitViewController 가 대상이다. 이 글은 지속적으로 업데이트 될 수도 있다.

2016년 5월 18일 수요일

NSOutlineView Cheatsheet

NSOutlineView 에 대해 겪거나 필요한 내용을 정리한다. 이 글은 계속 업데이트 될 수 있다. 기본적인건 NSTableView 와 비슷하니 참고하자.

2016년 5월 17일 화요일

NSTableView Cheatsheet

NSTableView 에 대해 개인적으로 겪거나 필요한 내용을 정리했다. 이 글은 지속적으로 업데이트 될 수도 있다.

2016년 5월 11일 수요일

Swift - Assertion과 컴파일 최적화

assert() 라는 함수는 C언어 시절 부터 예기치 못한 에러를 잡기 위한 무기(?)로써 활용되어 왔다. 문제가 생길 것 같으면 일부러 자살(?)하기 위한 무기가 바로 assert()이다.

2016년 4월 27일 수요일

2016년 4월 20일 수요일

Swift - @noescape 너 정체가 뭐냐

예전에 Swift 1.2 변동사항에 대해 쓰면서 뭔지 잘 모르고 넘어갔었는데 갑자기 궁금해져서 그 정체를 찾아보기 시작했다. (참고로 현재 Swift 최신 안정 버전은 2.2 이다 -_-) 이번 글은 바로 이 @noescape 속성에 관한 내용이다.

2016년 4월 6일 수요일

Swift - 언제 class 대신 struct 를 사용하는가

Swift 언어 포럼에서는 struct와 class의 차이와 이를 언제 쓰는게 좋냐라는 주제에 대해 자주 토론이 되는 것 같다. 개인적으로도 관심이 많은 편이다보니 좀 정리가 필요할 것 같다는 생각이 들었다.

2016년 3월 23일 수요일

Swift 2.2 에선 뭐가 바뀌었나

Xcode 7.3과 함께 Swift 2.2도 함께 정식으로 릴리즈 되었다. 요즘엔 공식사이트도 생기고 오픈소스화 되면서 변경 내역을 접하기가 쉬워지고 정리도 잘 되어 있어서 이런 글을 적는게 의미가 있나 고민되기는 하지만, 그래도 복습하는 겸 정리해본다.