본문 바로가기
반응형

SWIFT41

Xcode 12.3에서 발생하는 Fat Framework 링크 오류 문제 Xcode를 12.3 버전으로 올린 이후부터 회사 프로젝트를 빌드할 때 아래와 같은 오류가 발생하기 시작했다. Building for iOS, but the linked and embedded framework 'Foobar.framework' was built for iOS + iOS Simulator. 이 프로젝트는 비공개 iOS용 라이브러리와 iOS 시뮬레이터용 라이브러리를 lipo를 이용해 합쳐서 만든 Fat Framework(혹은 Universal Framework)다. 이 프레임워크로 이전 버전의 Xcode에서는 빌드가 잘 되었는데 유독 12.3부터 이런 식의 오류가 발생하기 시작했다. 해결하기 이 문제의 해결은 의외로 쉽다. Target의 Build Settings에서 Validate Wor.. 2020. 12. 17.
SwiftUI의 PreviewProvider와 Binding SwiftUI는 개발 단계에서 라이브 프리뷰를 통해 코드의 모습을 즉석에서 확인할 수 있습니다. 그런데 @Binding 처럼 외부의 값을 대여해 주어야 하는 경우 샘플 프리뷰를 작성할 때 약간의 곤란함이 있습니다.예를 들어 아래의 예제가 있습니다.import SwiftUIstruct SomeView: View { @Binding var name: String var body: some View { Text("Hello \(name)") }}struct SomeView_Previews: PreviewProvider { static var previews: some View { SomeView(name: "John") }}위에서 SomeView_Previe.. 2020. 12. 14.
SwiftUI에서 SF Symbols 사용하기 SF Symbols가 뭔지 어떻게 사용하는지 간단하게 알아봅시다. 워낙 간단하기 때문에 굳이 글로 적는 게 의미가 있나 싶을 정도로 쉬운 내용입니다. 다만 이 글 작성의 기준은 iOS 13 이상, Xcode 12 이상, macOS 앱이나 멀티플랫폼 앱의 경우 Big Sur 이상이 요구될 수도 있습니다.SF Symbols는 애플에서 제공하는 이미지 아이콘 모음입니다. 어려울 것 없이 'SF Symbols.app' 앱을 찾아서 실행시켜 보면 바로 알 수 있지요.SF Symbols 앱의 모습을 보면 이 아이콘들은 폰트 기반 제공되는 것으로 유추됩니다.만약 시스템에서 SF Symbols.app을 찾을 수 없다면 별도로 다운로드해서 설치할 수 있습니다. SF Symbols - Apple DeveloperWith .. 2020. 11. 18.
SwiftUI macOS 앱에서 타이틀 바와 툴바가 통합된 윈도우 구현하기 이 글의 목표는 SwiftUI를 사용하는 macOS 앱 프로젝트에서 아래와 같은 윈도우를 구현하는 것입니다.나눠서 설명했더니 글이 좀 길어졌습니다. 결론만 보시려면 글 하단에 정리한 전체 코드를 참고하시면 될 것 같습니다.기본 프로젝트사용하는 프로젝트는 macOS App으로 SwiftUI를 사용하도록 설정했습니다. 당연히 이게 조건이니깐요.기본 프로젝트는 위와 같은 모양으로 실행됩니다.Unified Title and Toolbar프로젝트 생성 시 보일러플레이트 코드가 생성된 AppDelegate.swift 파일을 열어보면 NSWindow 인스턴스를 생성하는 코드가 있습니다. 여기에서 styleMask를 설정할 수 있습니다. 여기에 아래와 같이 .unifiedTitleAndToolbar 플래그를 추가합니다.. 2020. 11. 12.
Swift 5.3에서는 뭐가 바뀌었을까? Xcode 12.0이 정식 릴리즈 되면서 이제 Swift 5.3도 현역이 되었습니다. 이미 많은 업데이트 내역을 정리한 글들이 있지만, 개인적으로 공부 삼아서 이번에도 늦었지만 정리해 보고자 합니다. 다만 개인적으로 내부 구현이 바뀌는 것은 딱히 관심이 없고 공부라는 의미도 있는 만큼 이 글은 문법적으로 변경되는 사항만을 정리합니다. 제안의 내용만으론 이해가 안 되는 내용도 있어서 여기저기 찾아보면서 정리했기 때문에 일부 틀린 내용이 있을 수도 있습니다. 여러 예외를 처리할 수 있는 catch 절 SE-0276 Multi-Pattern Catch Clauses 제안으로 구현된 기능입니다. 기존에는 예외 처리를 위한 do - catch 구문에서 catch는 하나의 예외만 잡을 수 있었습니다. 5.3부터는 .. 2020. 9. 28.
Swift System 오픈소스화 소식 애플에서 저수준 시스템 콜 라이브러리인 Swift System을 오픈소스화 했다는 소식이 공식 블로그를 통해서 전해졌습니다. Swift System is Now Open Source In June, Apple introduced Swift System, a new library for Apple platforms that provides idiomatic interfaces to system calls and low-level currency types. Today, I’m excited to announce that we’re open-sourcing System and adding Linux support! Our visi swift.org Swift System은 멀티 플랫폼 라이브러리로 시스템 콜.. 2020. 9. 27.
Swift 5.2 업데이트 내역 살펴보기 이 글은 스위프트 공식 블로그의 Swift 5.2 Released! 글에서 언급한 두 가지 업데이트된 기능을 살펴보는 글입니다. 이 외에도 사실 여러 업데이트가 있겠지만 아무래도 이게 핵심이니까 언급한 것이겠죠? 키 경로 표현식을 함수처럼 사용하기 SE-0249 Key Path Expressions as Functions 제안을 통해 Swift 5.2에 구현된 기능입니다. 이 기능은 함수나 클로져를 넘겨서 처리하는 다양한 기능에서 함수나 클로져 대신 키 경로(Key Path)를 넘기는 것으로 구현을 간단하게 할 수 있도록 해줍니다. 간단하게 위의 제안 내용의 예제를 인용해 보겠습니다. 우선 아래의 구조체 User를 선언했습니다. struct User { let email: String let isAdmi.. 2020. 3. 25.
Swift와 ObjC에서 Deprecated 처리하기 Swift와 Objective-C에서 클래스나 메서드, 프로퍼티 등을 Deprecated로 만드는 방법을 정리하는 글입니다.Deprecated는 단순히 말해서 '곧 사라질 기능'을 표기할 때 사용합니다. 오래된 프레임워크를 버전업 하거나 했을 때 노란 딱지로 빌드 경고가 뜰 때 이런 Deprecated 경고를 종종 볼 수 있습니다. 기능이 이름의 변경 혹은 리팩터링 등으로 바뀌게 될 부분을 미리 알려주는 용도로도 자주 사용되지요.Swift의 경우Swift에서는 @available을 통해 deprecated 표기를 할 수 있습니다.@available(*, deprecated)class SomeClass { ... }함수나 메서드도 동일하게 사용합니다.@available(*, deprecated)func s.. 2020. 3. 3.
Combine과 SwiftUI 컴바인을 활용해서 실무에 좀 더 유용한 내용을 알아봅시다. Combine을 활용하는 가장 직접적인 예는 아마도 이 글에서 살펴볼 Swift 5.1부터 제공되는 Property Wrapper와 이를 이용해 만들어진 SwiftUI의 몇 가지 기능이 이에 해당할지도 모르겠습니다.이 글에서 살펴볼 것은 네 가지 키워드입니다. 바로 State, Binding, Observed Object, 그리고 Environment Object입니다. 이 키워드들은 Combine을 이용해 구현한 Property Wrapper를 응용해서 만들어진 것들이지요.이 글은 Swift 5.1, Xcode 11.3을 기준으로 작성하였습니다.StateState는 이름처럼 상태 그 자체를 나타냅니다. 영어로는 Source of Truth라고도.. 2020. 1. 28.
약간은 더 현실적인 Combine 예제들 컴바인에 대한 여러 개념적인 이야기들을 써오긴 했는데 역시 개념 설명 글은 와 닿는 것이 없는 것 같습니다. 아무래도 현실적으로 현업에서 쓸 만한 예제는 아니니깐요. 그래서 이번에는 조금은 더 실용성이 있어 보이는 컴바인 예제 투성이라는 주제로 글을 써봅니다.기본 자료구조의 퍼블리셔스위프트(Swift)는 다채로운 자료구조를 제공합니다. 예를 들어 기본 타입도 있겠지만 배열(array)이나 사전형(dictionary) 같은 복잡한 자료구조도 있지요.대표적으로 Sequence.publisher를 살펴보겠습니다. 이 타입은 보통 배열(array) 혹은 리스트(list)라고도 불리며 굉장히 자주 쓰이는 타입이지요?let publisher = [1, 2, 3, 4, 5].publisherpublisher ... 2020. 1. 27.
Combine 이벤트 체인이 왜 필요할까? 앞서 작성한 글에서 Combine Framework의 기본 개념인 퍼블리셔(Publisher)와 서브스크라이버(Subscriber), 그리고 서브젝트(Subject)에 대해 간략히 살펴봤습니다. 이번 글에서는 왜 이런 것을 이용해 프로그래밍을 하는지에 대한 이유를 정리해보고자 합니다. 사실 잘 설명할 수 있을지는 의문이긴 합니다만, 개인적으로도 글로 정리하는 것이 큰 공부가 되기에 억지로(?) 글을 써 봅니다.전통적인 예제그냥 다짜고짜 예제부터 시작해 봅시다.var value = 1if value % 2 == 0 { print("\(value) is even!")}이 코드의 의도는 value의 값이 짝수인지 판단하는 것입니다. 짝수이면 해당 값을 콘솔에 찍지요. 실행시키면 당연하게도 1은 짝수가 아.. 2020. 1. 23.
Combine Framework는 어떤 녀석일까요? Combine Framework는 SwiftUI가 소개되면서 함께 소개된 정체 불며의 이벤트 기반 데이터 흐름 처리 프레임워크입니다. 근데 이 설명은 사실 멋대로 붙인 거고, 실제론 Rx의 애플판이라는 말이 더 맞다고는 하는데 저는 Rx도 몰라요. 그렇다면 바닥부터 공부해야겠네요... 아아...Combine FrameworkCombine 은 이벤트 처리 오퍼레이터를 조합하여 만든 비동기 이벤트 처리 프레임워크입니다. 네 뭔 소리인지 모르겠습니다. 어쨌든 앞서 이야기 했다시피 보통은 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.
728x90
반응형