클라이언트 프로그램 개발을 그다지 좋아하지 않는 내가 모바일 앱 개발을 해 본 경험이라면
지금으로부터 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 코드를 호출하는 방법은 조금 더 복잡하다.
위 글에 자세히 나와 있는데, 설명이 좀 어렵다. 뭐가 어떻게 된다는 건지 이해하기 어렵다.
한글로 된 설명도 있다. 간결하다. 이왕 방법을 쓸 거면 이렇게 써야지 말이야...
4. 콜백 또는 대리자(delegate)를 Swift에서 사용하는 방법은 아래에 나와 있다.
>> 참조: https://useyourloaf.com/blog/quick-guide-to-swift-delegates/
5. 그 밖에 아직 무슨 소린지 모르겠지만 뭔가 얻은 교훈이 있다는 사람의 글.
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 }
일단 이 정도... (계속 업데이트 예정)
'Tech: > 일반·기타' 카테고리의 다른 글
안드로이드 개발: proguard 적용 시 주의할 점 (0) | 2019.06.24 |
---|---|
MacMini VNC 접속 시 까만화면이?! (0) | 2019.04.08 |
애플 앱 기업 내 배포(Apple Developer Enterprise Program) (0) | 2019.03.15 |
POP3, IMAP4 서비스 SSL/TLS 동작 여부 및 인증서 확인 (0) | 2019.03.05 |
Windows 10 최신 1809버전(17763.292) RDPWrap 적용?! (0) | 2019.02.22 |