본문 바로가기
반응형

기술적인 이야기/애플 플랫폼 개발48

Swift와 ObjC에서 Deprecated 처리하기 Swift와 Objective-C에서 클래스나 메서드, 프로퍼티 등을 Deprecated로 만드는 방법을 정리하는 글입니다. Deprecated는 단순히 말해서 '곧 사라질 기능'을 표기할 때 사용합니다. 오래된 프레임워크를 버전업 하거나 했을 때 노란 딱지로 빌드 경고가 뜰 때 이런 Deprecated 경고를 종종 볼 수 있습니다. 기능이 이름의 변경 혹은 리팩터링 등으로 바뀌게 될 부분을 미리 알려주는 용도로도 자주 사용되지요. Swift의 경우 Swift에서는 @available을 통해 deprecated 표기를 할 수 있습니다. @available(*, deprecated) class SomeClass { ... } 함수나 메서드도 동일하게 사용합니다. @available(*, deprecated.. 2020. 3. 3.
2020년 4월부터 소셜 로그인 지원 시 애플 인증 강제 애플은 'Sign in with Apple'로 알려진 'Apple로 로그인' 기능 지원에 대해 아래와 같은 가이드라인을 발표했습니다. 오늘부터 App Store에 제출하는 신규 앱은 해당 가이드라인을 따라야 하며, 기존의 앱과 앱 업데이트는 2020년 4월 전까지 해당 가이드라인을 따라야 합니다. - Apple로 로그인에 대한 신규 가이드라인 이미 이 인증 기능이 발표될 때부터 상황에 따라 강제될 것이라는 소식이 전해져 왔고 많은 앱들이 이미 지원하기 시작한 기능이라 그다지 새로운 것은 아닙니다만, 기존 앱들에 대한 제약이 이번에 확정되었기 때문에 업데이를 하지 않았다면 준비를 급하게 해야 할 시점인 것 같습니다. 애플 자체 인증 기능을 반드시 구현해야 할 필요는 없습니다. 하지만 App Store 심사.. 2020. 2. 18.
Combine과 SwiftUI 컴바인을 활용해서 실무에 좀 더 유용한 내용을 알아봅시다. Combine을 활용하는 가장 직접적인 예는 아마도 이 글에서 살펴볼 Swift 5.1부터 제공되는 Property Wrapper와 이를 이용해 만들어진 SwiftUI의 몇 가지 기능이 이에 해당할지도 모르겠습니다. 이 글에서 살펴볼 것은 네 가지 키워드입니다. 바로 State, Binding, Observed Object, 그리고 Environment Object입니다. 이 키워드들은 Combine을 이용해 구현한 Property Wrapper를 응용해서 만들어진 것들이지요. 이 글은 Swift 5.1, Xcode 11.3을 기준으로 작성하였습니다. State State는 이름처럼 상태 그 자체를 나타냅니다. 영어로는 Source of Trut.. 2020. 1. 28.
약간은 더 현실적인 Combine 예제들 컴바인에 대한 여러 개념적인 이야기들을 써오긴 했는데 역시 개념 설명 글은 와 닿는 것이 없는 것 같습니다. 아무래도 현실적으로 현업에서 쓸 만한 예제는 아니니깐요. 그래서 이번에는 조금은 더 실용성이 있어 보이는 컴바인 예제 투성이라는 주제로 글을 써봅니다. 기본 자료구조의 퍼블리셔 스위프트(Swift)는 다채로운 자료구조를 제공합니다. 예를 들어 기본 타입도 있겠지만 배열(array)이나 사전형(dictionary) 같은 복잡한 자료구조도 있지요. 대표적으로 Sequence.publisher를 살펴보겠습니다. 이 타입은 보통 배열(array) 혹은 리스트(list)라고도 불리며 굉장히 자주 쓰이는 타입이지요? let publisher = [1, 2, 3, 4, 5].publisher publisher.. 2020. 1. 27.
Combine 이벤트 체인이 왜 필요할까? 앞서 작성한 글에서 Combine Framework의 기본 개념인 퍼블리셔(Publisher)와 서브스크라이버(Subscriber), 그리고 서브젝트(Subject)에 대해 간략히 살펴봤습니다. 이번 글에서는 왜 이런 것을 이용해 프로그래밍을 하는지에 대한 이유를 정리해보고자 합니다. 사실 잘 설명할 수 있을지는 의문이긴 합니다만, 개인적으로도 글로 정리하는 것이 큰 공부가 되기에 억지로(?) 글을 써 봅니다. 전통적인 예제 그냥 다짜고짜 예제부터 시작해 봅시다. var value = 1 if value % 2 == 0 { print("\(value) is even!") } 이 코드의 의도는 value의 값이 짝수인지 판단하는 것입니다. 짝수이면 해당 값을 콘솔에 찍지요. 실행시키면 당연하게도 1은 짝수.. 2020. 1. 23.
Combine Framework는 어떤 녀석일까요? Combine Framework는 SwiftUI가 소개되면서 함께 소개된 정체 불며의 이벤트 기반 데이터 흐름 처리 프레임워크입니다. 근데 이 설명은 사실 멋대로 붙인 거고, 실제론 Rx의 애플판이라는 말이 더 맞다고는 하는데 저는 Rx도 몰라요. 그렇다면 바닥부터 공부해야겠네요... 아아... Combine Framework Combine 은 이벤트 처리 오퍼레이터를 조합하여 만든 비동기 이벤트 처리 프레임워크입니다. 네 뭔 소리인지 모르겠습니다. 어쨌든 앞서 이야기 했다시피 보통은 Rx라는 것이 사용하던 반응형(Reactive) 프로그래밍 라이브러리라고 설명합니다. 뭐 이렇게 이야기 해 봤자 의미 없으니 막무가내로 예제 코드부터 시작합시다. import Combine 네. Combine 은 프레임워크.. 2020. 1. 15.
[Swift 5.1] Identifiable (SE-0261) 이 변경점은 SE-0261 Identifiable Protocol에서 제안된 내용입니다. 이번에 새롭게 추가된 Identifiable 프로토콜은 아래처럼 생겼습니다. protocol Identifiable { associatedtype ID: Hashable var id: ID { get } } 그냥 단순하게 ID 하나를 구현하는 것임을 알 수 있습니다. 목적은 매우 단순합니다. 말 그대로 ID를 구현하는 것입니다. 다른게 비유하자면 신원 확인 가능성을 구현하는 것입니다. 대한민국 사람이라면 쉽게 이해할 수 있을만한 것이 바로 주민등록번호를 들 수 있을 것 같습니다. 아래의 예는 '한국인'이라는 구조체에 이 Identifiable을 구현하는 예제입니다. struct Korean: Identifiable .. 2019. 11. 12.
[Swift 5.1] 리턴 생략 가능 (SE-0255) Swift 5.1에 추가된 매우 단순하면서도 편리해진 기능으로 SE-0255 Implicit returns from single-expression functions 제안으로 추가된 기능을 살펴봅시다. 아래와 같은 단순한 코드를 살펴봅시다. var three: Int { return 1 + 2 } 3이라는 값을 돌려주는 three라는 계산형 프로퍼티를 선언한 예제입니다. 뭐 특별한 것이 없어 보이죠? Swift 5.1에서는 위 코드를 아래처럼 좀 더 단순화시킬 수 있습니다. var three: Int { 1 + 2 } 보시다시피 return문이 보이질 않습니다. 이 기능은 단순한 수식 문의 경우 return 없이도 정의할 수 있게 만들어 줍니다. 굳이 프로퍼티가 아니라 함수 등에도 사용할 수 있습니다. .. 2019. 11. 5.
[Swift 5.1] Static Subscript (SE-0254) 이 글은 Swift 5.1에 제안된 SE-0254 Static and class subscripts 업데이트를 살펴보는 글입니다. 결론부터 말해서 이제 subscript를 static 하게 쓸 수 있습니다. 이번에도 다짜고짜 예제로 살펴봅시다. struct HTTPStatus { private static var map = [Int: String]() static subscript(_ code: Int) -> String? { get { map[code] } set { map[code] = newValue } } } 위 예제에서 subscript가 static으로 선언되어 있습니다. 따라서 이제 인스턴스화 시키지 않고도 아래처럼 접근할 수 있습니다. HTTPStatus[200] = "Ok" HTTPSta.. 2019. 10. 31.
[Swift 5.1] 키 패스를 이용한 동적 멤버 찾아보기 (SE-0252) 이 글은 SE-0252 Key Path Member Lookup 제안을 통해 Swift 5.1에서 확장된 동적 멤버 찾아보기(dynamic member lookup) 기능을 간략히 살펴보는 글입니다. 이 업데이트는 Swift 4.2에서 추가된 @dynamicMemberLookup의 기능을 좀 더 확장시킵니다. 일단 다짜고짜 기존(?) 예제부터 봅시다. @dynamicMemberLookup struct SomeInfo { let properties: [String : String] = [ "name": "James", "city": "LA" ] subscript(dynamicMember string: String) -> String { return properties[string]! } } let info.. 2019. 10. 30.
[Swift 5.1] 초기화 없는 배열 생성하기 (SE-0245) 이 뜬금없는 제목의 변화는 SE-0245 Add an Array Initializer with Access to Uninitialized Storage 프로포절에서 제시된 내용입니다. 일반적으로 Swift에서 Array를 특정 개수의 배열로 만들기 위해서는 반드시 데이터를 채워 넣어야 합니다. 예를 들어 5개 크기의 배열을 만든다면 아래와 같은 식이죠. let list = [0, 0, 0, 0, 0] 물론 이것 말고로 몇 가지 단순화된 방법이 있긴 하지만 아마도 이게 가장 흔한 예제일 것 같습니다. 그런데 굳이 초기화 값이 꼭 필요한 것이 아니라면 Swift 5.1부터는 아래와 같은 식으로도 만들 수 있게 됩니다. let list = [Int](unsafeUninitializedCapacity: 5) {.. 2019. 10. 24.
[Swift 5.1] Opaque Result Types 그리고 some (SE-0244) 이번 글은 아마도 Swift 5.1 업데이트 내역 중 제가 가장 이해하기 힘들었던 변화 같습니다. SE-0244 Opaque Result Types에서 소개된 불투명한 결과 타입(Opaque Result Types)을 위한 some이라는 키워드 도입에 관한 내용입니다. 말로 설명하기 어려우니 예제를 봅시다. 아래 코드는 어떤 컬렉션을 만족하는 인스턴스를 돌려주는 함수를 구현하고 있습니다. func someList() -> Collection { return [1, 2, 3] } 안타깝게도 위 코드는 아래와 같은 빌드 에러를 발생시킵니다. Protocol 'Collection' can only be used as a generic constraint because it has Self or associat.. 2019. 10. 18.
[Swift 5.1] 구조체 생성자에 기본값 지원 (SE-0242) SE-0242 Synthesize default values for the memberwise initializer에서 소개된 프로포절이 5.1에서 구현되었습니다. 워낙 간단한 변화이고 내용도 쉬운 편이라 예제를 프로포절의 것 그대로 옮겨봅니다. struct Dog { var age: Int = 0 var name: String } 위 코드에서 주의 깊게 봐야 할 점은 age 프로퍼티에 초기값이 부여되어 있다는 점입니다. 그럼에도 기존 Swift 버전의 경우 생성되는 기본 생성자는 age와 name 두 파라미터 모두 초기값이 필요하게 생성되었습니다. 5.1부터는 이제 "초기값이 있는 프로퍼티는 굳이 생성할 때 값을 입력받을 필요가 없지 않냐"라는 요구가 받아들여져서 아래와 같이 사용할 수 있는 기본 생성.. 2019. 10. 17.
[Swift 5.1] 순서가 있는 콜렉션끼리 차이점 비교하기 (SE-0240) SE-0240 Ordered Collection Diffing 프로포절은 제목처럼 컬렉션끼리 비교해서 차이점을 얻기 위한 것으로 Swift 5.1에 구현되었습니다. 단순하게 말하자면 difference()라는 메서드가 Collection에 추가되었다라고도 볼 수 있겠네요. 일단 예제를 봅시다. let alpha1 = ["a", "b", "c"] let alpha2 = ["a", "c", "d"] let diff = alpha1.difference(from: alpha2) for d in diff { print(d) } .difference() 메서드를 이용해 두 컬렉션을 비교할 수 있습니다. 결과는 CollectionDifference라는 타입의 컬렉션으로 돌아오는데 데이터를 가지고 있는 enum 필드들.. 2019. 10. 15.
[Swift 5.1] Self 키워드의 기능 추가 (SE-0068) macOS Catalina 공식 버전 출시 이후로 늦었지만 Swift 5.1의 변화점들에 대해 공부하고 있습니다. 이 글을 시작으로 Swift 5.1에서 뭐가 바뀌었는지 눈에 띄는 것들을 글로 정리해보고자 합니다. 첫 글은 SE-0068 Expanding Swift Self to class members and value types에서 소개된 Self의 기능 확장에 대한 이야기입니다. 뭐 아시겠지만 Self는 원래 자기 자신의 동적 클래스(dynamic class)를 가리키는 키워드입니다. 우선 예제를 살펴봅시다. class MyClass { class var name: String { return "unknown name" } func show() { print("My name is \(MyClass... 2019. 10. 13.
Swift 5에서는 뭐가 바뀌었을까? Swift 5가 지원되는 Xcode 10.2가 정식으로 릴리즈 되었습니다. 이에 발맞춰 (그리고 공부 삼아) Swift 5의 변경점을 정리해 보는 글입니다. 이 글은 공식 블로그의 Swift 5 릴리즈 소식을 기준으로 작성합니다. ABI Stability Swift 5는 ABI Stability, 즉 바이너리 레벨의 API 호환성을 드디어 안정화시킨 버전입니다. 이제 사용하는 프레임워크나 라이브러리가 Swift 5 이상으로 빌드했다면 컴파일러가 버전 다르다고 투덜거리는 것을 볼 확률이 많이 없어진다는 말입니다. Raw Text SE-0200 Enhancing String Literals Delimiters to Support Raw Text 이스케이프(escape) 등 문자열 대치(String Inter.. 2019. 4. 7.
728x90
반응형