본문 바로가기

프로그래밍/SWIFT

(32)
VSCode Swift Formatter 설정 2023년 9월 현재, vscode 에는 두개의 스위프트 포매터 익스텐션이 있는 것 같다. apple-swift-format 과 SwiftFormat. apple-swift-format 을 써왔었는데, 인덴트가 2로 포맷했다. 개인적으로 가독성이 안 좋았고, xcode 로 열어서 다시 편집하면 4 스페이스로 포맷을 해서, 쓸데없는 변경점이 만들어졌다. 그런데 인덴트를 설정하는 걸 잘 모르겠더라. --- 그래서 SwiftFormat 으로 설정하였다. brew install swiftformat 으로 우선 포매터 프로그램을 설치하고 (SwiftFormat 익스텐션은 swiftformat 이라는 커맨드라인 툴을 이용한다.), vscode 익스텐션들 중에 SwiftFormat 을 찾아서 설치하고 활성화한다. 이..
SIL ( Swift Intermediate Language ) 스위프트 중간 언어 스위프트 컴파일러가 .swift 소스파일을 컴파일하는 과정은 스위프트 언어를 스위프트 중간언어(swift intermediate language)로 우선 만들고, 이것을 다시 llvm IR ( intermediate representation ) 으로 바꾸고, 마지막으로 기계어를 생성하는 단계를 거친다. .swift 소스에서 변환된 SIL 을 보려면 swiftc 를 이용하여 -emit-sil 옵션으로 컴파일 하면 된다. swiftc -emit-sil .swift 아주 간단한 Point 스트럭쳐를 선언하여, 이를 sil 로 변환하면 다음과 같다. struct Point { let x:Int let y:Int } struct Point { @_hasStorage let x: Int { get } @_hasS..
SwiftUI] StateObject, Published, ObservableObject https://www.hackingwithswift.com/books/ios-swiftui/sharing-swiftui-state-with-stateobject swiftui 에서 struct 인스턴스 변수는 간단한 @State 로 (내부 프로퍼티의) 변경을 감지하여 UI에 반영할 수 있다. 하지만 class 인스턴스 변수는 @State 를 붙여도 내부 프로퍼티의 변경을 감지하지 못한다. class 의 내부 프로퍼티의 변경을 감지하도록 하는 방법은 다음과 같다. 1. 외부에서 변경을 감지하려는 클래스의 프로퍼티에 @Published 를 붙여준다. class User { @Published var name: String = "Micky" @Published var age: Int = 10 } 2. view..
[유튭링ㅋ] Mastering Concurrency in iOS 인도형의 유튜브 강좌. 발음이 좀 거북하지만, 매우 잘 정리해 준다. Mastering Concurrency in iOS - Part 1 (Concurrency, GCD Basics) https://youtu.be/X9H2M7xMi9E Mastering Concurrency in iOS - Part 2 (Dispatch Queues, Quality of Service, Attributes) https://youtu.be/yH0RBTdNi3U Mastering Concurrency in iOS - Part 3 (Dispatch Group, Dispatch Work Item) https://youtu.be/SGEWlYB6ZM0 Mastering Concurrency in iOS - Part 4 (Dispat..
[Swift] 가장 간단한 Actor 샘플코드, Actor Counter swift concurrency 에 actor 라는 개념이 있다. 가장 간단하게 actor 를 사용하는 예제를 만들어 보았다. ( with a little help of gpt ) 횟수를 카운트 하는 매우 간단한 카운터 class/actor이다. 카운터를 생성해서, 동시에 수행되는 두 태스크에서 동시에 카운팅이 이루어진다. import Foundation actor MyActorCounter { var counter = 0 func incrementCounter() { counter += 1 } } class MyClassCounter { var counter = 0 func incrementCounter() { counter += 1 } } func testActorCounter() async -> V..
SWIFT 기초] 배열 슬라이싱 python과 swift 비교 >>> l = list(range(10)) >>> l [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> l[:3] [0, 1, 2] >>> l[3:7] [3, 4, 5, 6] >>> l[7:] [7, 8, 9] 위와 같은 파이썬에서의 슬라이싱을 swift 에서는 다음과 같이 할 수 있다. 39> let l = Array(0.. l[0.. l[3.. Array(l[7...]) $R25: [Int] = 3 values { [0] = 7 [1] = 8 [2] = 9 } 43> l[7..
[SwiftUI] @State, struct, class https://www.hackingwithswift.com/books/ios-swiftui/why-state-only-works-with-structs why state only works with structs 라는 제목의 강의. swiftui 에서 변경될 수 있는 변수에 @State 를 붙이는 것에 익숙해졌다. 이 @State 변수에는 스위프트의 기본 형 뿐만 아니라, 사용자형도 사용할 수 있다. 다음과 같다. struct User { var firstName = "Bilbo" var lastName = "Baggins" } struct ContentView: View { @State private var user = User() var body: some View { VStack { VStack {..
[Swift] publishing changes from background threads is not allowed; make sure to publish values from the main thread swiftui 에서 async 콘텍스트에서 UI 와 관련된 변수를 업데이트할 때 발생한다. xcode에서 보라색으로 나타나는 워닝이다. UI 관련 변수를 업데이트할 때에는 main 쓰레드에서 업데이트 될 수 있도록, await MainActor.run { } 블록으로 감싸주어야 한다. 이 방법은 이전에 사용하던 DispatchQueue.main 을 대체하는 방식이다. 이 방법도 가능하지만, 더 아름다운 방식은, @MainActor 어노테이션을 사용하는 것. 해당 변수를 업데이트하는 코드가 들어있는 함수 선언에 어노테이션을 더해준다. @MainActor func uiUpdateFunc() - ref : Modern Concurrency in Swift Chapter 1, 2