클라이언트 프로그램 개발을 그다지 좋아하지 않는 내가 모바일 앱 개발을 해 본 경험이라면

지금으로부터 17~18년은 훌쩍 넘은 과거에 Pocket PC용 앱을 몇 개 만들어 본 이후에

가장 최근이라 해봤자 거의 십 년 전, 안드로이드로 똑같이 만들어 본 것이 전부다.


현 회사에는 모바일 개발자가 따로 있는 관계로 애써 신경을 끄고 살았는데,

살다보니 내가 애플 iOS 앱을 직접 개발/유지보수할 일도 다 생긴다. ㄷㄷ

(iOS 앱 개발을 하려면 무조건 맥북이나 맥미니와 같은 맥킨토시 장비가 필요한 관계로

소스코드를 들여다 본 적은 있어도 실제 개발하거나 디버깅/테스트해 볼 기회는 없었기 때문이다.)


그러다 예전에 퇴사한 직원이 썼던 오래된 구형 맥미니 한 대를 받아 모셔만 놨다가

최근에 다시 만지작 거리기 시작하면서 개발 환경도 한 번 만들어 보게 되고, 

그러다 보니 빌드도 한 번 해 보게 되고...

빌드가 잘 되니 장치에 연결해서 배포도 한 번 해 보고 싶어지게 되고... 

뭐 그런 과정을 거쳐 iOS 앱 개발에도 슬쩍 발을 담그게 되고 말았다.





서론이 길었는데,

아무튼, 결론부터 얘기하자면,

Objective-C 코드는 직관성이 겁나게, 엄청시리, 무지막지하게 떨어진다.


두꺼운 Cocoa 책을 한 권 다 읽고 샘플 코드를 다 만들어봐도

실제 소스코드를 보면 이게 대체 뭔 소린지 멘붕...

물론 상세하게 오래 들여다보면 뭐가 뭔지는 알 듯한 기분이 되지만 

기본적으로 영~ 해독이 어렵다. (일단 대괄호로 함수명에 파라미터까지 묶은 게 제일 큰 에러...)


애플은 뭘 이 따위 언어를 만들어서 여러 사람 고생시키나 몰러...

걍 ANSI C나 C++로 만들든가.

남들 쓰는 건 안 쓴다는... 나름 개발 언어에서마저도 혁신적인 독창성을 추구하는 것?




그러다가 이제 애플도 개발 언어의 대세를 최신 고급 언어의 트렌드가 대부분 반영된

Swift로 옮겨왔다는 소문을 뒤늦게 접하고(-_-a)

Objective-C로 만들어진 앱을 Swift 4.2 기반 코드로 변환하는 작업을 한번 해볼까 마음먹게 되었고,

그 과정에서 발생한 문제를 해결해 나가면서 알게 된 정보들을 간략히 적어 본다.



1. Objective-C 코드를 Swift 코드로 변환해 주는 사이트가 있다.


https://objectivec2swift.com/#/converter/code/


바로 여기.

맛보기는 1KB까지지만, 회원 가입을 하면 4KB까지 변환해 준다. (물론 그대로 쓸 수는 없는 코드다.)

Objective-C나 Swift를 하나도 몰라도 기존 코드를 변환할 수 있다는 자신감(?)을 심어준다.



2. 그래도 Swift 언어의 기본은 알아야지.


>> 참조: https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html


이 글과,


>> 참조: https://docs.swift.org/swift-book/GuidedTour/GuidedTour.html


이 글 정도는 읽어 봐야지.

(요즘은 정말 온라인으로 공부하기 편하게 되어 있다. 내용들이 참 알차다.)



3. Objective-C 코드와 Swift 코드를 혼용해서 쓸 수 있다.


Swift코드에서 Objective-C 코드를 호출하는 방법은 비교적 간단하다.


>> 참조: https://stackoverflow.com/questions/24002369/how-to-call-objective-c-code-from-swift


위 글에 나와 있는 대로 하면 그냥 된다.

간략히 설명하자면, 프로젝트명-Swift.h 파일 안에다가 참조할 헤더 파일명을 import 해주면 된다.


반면, Objective-C 코드에서 Swift 코드를 호출하는 방법은 조금 더 복잡하다.


>> 참조: https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_swift_into_objective-c


위 글에 자세히 나와 있는데, 설명이 좀 어렵다. 뭐가 어떻게 된다는 건지 이해하기 어렵다.


>> 참조: https://medium.com/@justindna/objective-c-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%97%90%EC%84%9C-swift-%EC%82%AC%EC%9A%A9-cd3e893c02a4


한글로 된 설명도 있다. 간결하다. 이왕 방법을 쓸 거면 이렇게 써야지 말이야...





4. 콜백 또는 대리자(delegate)를 Swift에서 사용하는 방법은 아래에 나와 있다.


>> 참조: https://useyourloaf.com/blog/quick-guide-to-swift-delegates/



5. 그 밖에 아직 무슨 소린지 모르겠지만 뭔가 얻은 교훈이 있다는 사람의 글.


>> 참고: https://blog.sendbird.com/ko/objective-c-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%A5%BC-swift%EB%A1%9C-converting%ED%95%98%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B5%90%ED%9B%88%EB%93%A4



6. Swift 언어의 핵심 개념: Closure


C#의 Lambda식 표현이나 Javascript의 Arrow 함수와 유사한 이 클로저Closure만 알면

문법적으로는 Swift에서 더 헷갈릴 것이 없다. 최신 개발언어 트렌드를 다 쫓아왔다.


아래 표현들은 모두 동일한 내용이다. 골 때리게 어마어마하다. 외어야 한다.


// 함수 파라미터 사용

reversedNames = names.sorted(by: backward)

func backward(_ s1: String, _ s2: String) -> Bool {

return s1 > s2

}


// 클로저 기본 표현

reversedNames = names.sorted(by: {(s1: String, s2: String) -> Bool in

return s1 > s2

})


// 클로저 한 줄 표현

reversedNames = names.sorted(by: {(s1: String, s2: String) -> Bool in return s1 > s2})


// 클로저 리턴 형식 생략

reversedNames = names.sorted(by: s1, s2 in return s1 > s2)


// 리턴문 생략

reversedNames = names.sorted(by: s1, s2 in s1 > s2)


// 암묵적 축약(변수명 생략)

reversedNames = names.sorted(by: \$0 > \$1)


// ??? 완전 축약

reversedNames = names.sorted(by: >)


// 후행 클로저

reversedNames = names.sorted() { \$0 > \$1 }


// 함수 표현 생략

reversedNames = names.sorted { \$0 > \$1 }



일단 이 정도... (계속 업데이트 예정)






Posted by 떼르미
,


자바스크립트를 허용해주세요!
Please Enable JavaScript![ Enable JavaScript ]