[SwiftUI] publishing changes from background threads is not allowed async await 원인, 해결 방법
·
[Programming Language]/[SwiftUI]
[머릿말]테스트용으로 만든 서버에서 데이터를 받아와 앱에 띄우는 과정에서 이 경고를 마주하게 되었다.이와 관련해서 이전에 GPT에게 무언가를 물어봤을 때 데이터의 갱신은 Main Thread에서 이뤄져야 한다고 답했던 기억이 어렴풋 난다. Synchronous, Asynchronous는 중요한 개념이므로 이 기회에 잘 정리해보고자 한다. 1. Main Thread vs Background ThreadSwiftUI에서 모든 UI 업데이트는 Main Thread에서 이뤄진다. 만약 시간이 오래걸리는 작업(ex. 다운로드 작업)을 Main Thread에서 수행한다면 해당 작업이 완료될 때까지 Main Thread는 다른 작업을 수행할 수 없으므로 앱이 일시정지된 것처럼 보이게 되고, 이는 좋지 않은 사용자 경..
[Swift] mutating 키워드란? (값 타입 인스턴스에서의 값 수정)
·
[Programming Language]/[Swift]
1. 값 타입 인스턴스 : 구조체(struct), 열거형(enum)Swift에서 구조체와 열거형은 값 타입이고, 클래스는 참조 타입이다. 1-1. class : 참조 타입참조 타입의 클래스의 인스턴스가 있을 때 값을 수정하는 메서드는 다른 프로그래밍 언어에서 했던 것처럼 하면 된다.class Account { private var balance: Int = 0 func getBalance() { print("잔고: \(balance)") } func deposit(_ amount: Int) { balance += amount } func withdraw(_ amount: Int) { balance -= amount..
[Swift] Queue 자료 구조 (removeFirst를 popLast로 대체하기)
·
[Programming Language]/[Swift]
[머릿말]Swift를 사용하여 Programmers에서 여러 코딩테스트를 풀고 있다. 어느덧 5천대 순위가 되었고 이전에는 Queue를 사용하여 문제를 풀어도 통과가 되었지만 이제는 시간 초과 오류를 가끔씩 접하곤 한다. 이는 removeFirst() 메서드의 시간 복잡도가 O(n)이기 때문인데, 이를 시간 복잡도가 O(1)인 popLast() 메서드로 대체하면 실행 시간을 훨씬 단축시킬 수 있다.1. 기존에 사용했던 QueuePython에는 Queue가 존재해서 좋았지만 Swift에는 존재하지 않는다. 따라서 배열을 사용하여 직접 Queue를 만들어 사용해야 한다. 기존에 문제를 풀 때 사용했던 Queue는 아래와 같이 그냥 배열 그 자체였다.// 기본 Queuevar queue: [Int] = []/..
[Swift] 메서드(Methods) [인스턴스•타입 메서드, mutating, self]
·
[Programming Language]/[Swift]
1. 인스턴스(Instance) 메서드, 타입(Type) 메서드Swift에서 메서드는 인스턴스 메서드와 타입 메서드로 나눠볼 수 있다. 인스턴스 메서드는 생성된 각각의 인스턴스에 대한 메서드라고 보면 되고 타입 메서드는 구조체나 클래스와 같은 타입 자체에 대한 메서드라고 보면 된다. 1-1. 인스턴스 메서드인스턴스 메서드란 구조체(Struct), 클래스(Class), 열거형(enum) 내에 선언되는 메서드를 말한다. class Person { var name: String var born: Int init(name: String, born: Int) { self.name = name self.born = born } func printAg..
[Swift] 프로퍼티 관찰자(Property Observers)
·
[Programming Language]/[Swift]
1. 프로퍼티 관찰자프로퍼티 관찰자란 프로퍼티의 값이 변경될 때 호출되는 것으로, 새로운 값이 기존 값과 동일하더라도 호출된다. 프로퍼티 관찰자에는 2가지 종류가 있다.willSet : 새로운 값으로 변경되기 전에 호출didSet : 새로운 값으로 변경되고 나서 호출1-1. willSetclass Asset { var totalMoney: Int = 0 { willSet(newTotalMoney) { print("새로운 잔액 : \(newTotalMoney)만원") } }}let asset = Asset()asset.totalMoney = 100 // 새로운 잔액 : 100만원위 예제에서 willSet은 asset.totalMoney = 100 부분..
[Swift] 프로퍼티(Property) [Stored •Computed, getter, setter, read-only]
·
[Programming Language]/[Swift]
1. 저장된 프로퍼티(Stored Property) vs 계산된 프로퍼티(Computed Property)프로퍼티는 저장하는 값에 따라 저장된 프로퍼티와 계산된 프로퍼티로 나뉜다. 1-1. 저장된 프로퍼티(Stored Property)먼저 저장된 프로퍼티란 우리가 다른 언어에서도 흔히 사용했던 멤버 변수의 개념으로, 다른 변수에 관계없이 스스로의 값을 갖는 변수 또는 상수를 말한다.struct Person { var name: String let age: Int}var p1 = Person(name: "John", age: 20)Person 구조체는 저장된 프로퍼티 변수(Variable Stored Property)인 name과 저장된 프로퍼티 상수(Constant Stored Property..
[Swift] 구조체(Structure) vs 클래스(Class) 차이점
·
[Programming Language]/[Swift]
1. 구조체(Structure)와 클래스(Class)의 공통점구조체와 클래스는 비슷하면서도 다르다. 둘다 아래와 같은 기능을 공통적으로 할 수 있다.Property(프로퍼티) 정의Method(메서드) 정의Subscript(서브스크립트) 정의init(초기화 함수) 정의extension(확장)Protocol(프로토콜) 준수 2. 구조체(Structure)와 클래스(Class)의 차이점2-1. 기본 초기화 함수구조체와 클래스 모두 프로퍼티의 기본값을 정의할 수 있다.struct PersonStructure { var name: String = "" var age: Int = 0}class PersonClass { var name: String = "" var age: Int = 0} 그러..
[SwiftUI] NavigationLink 파란색 오버레이 변경 방법
·
[Programming Language]/[SwiftUI]
[머릿말]NavigationLink를 적용한 각 항목은 하이퍼링크가 달렸을 때처럼 파란색 오버레이가 적용된다. 하지만 난 각 항목이 원래의 색상대로 표시되도록 하고 싶었다...1. foregroundStyle(_:) 사용첫 번째로는 각 항목에 대해 foregroundStyle(_:) 수정자를 적용하는 방법이 있다. 아래 예제에서 1번의 색을 초록색으로 변경해보았다.import SwiftUIstruct ContentView: View { var body: some View { NavigationStack { VStack(spacing: 20) { NavigationLink(value: "1") { Im..
[SwiftUI] NavigationStack 에서 back 버튼 색상 변경하는 방법
·
[Programming Language]/[SwiftUI]
[머릿말]NavigationStack을 사용하여 화면 전환을 구현할 때 상단에 기본적으로 back 버튼이 존재한다. 실제 존재하는 다른 앱들을 살펴보면 이 부분(상단바) 전체를 커스터마이징하여 사용하는 것 같다. 나는 일단 back 버튼의 색상만 기본 색상인 파란색에서 흰색으로 바꿔보았다.1. tint(_:) 사용import SwiftUIstruct ContentView: View { var body: some View { NavigationStack { List { Section("학과") { NavigationLink("컴퓨터공학과", value: "컴퓨터공학과") ..
[SwiftUI] Non-constant range: argument must be an integer literal
·
[Programming Language]/[SwiftUI]
[머릿말]임시로 뷰를 그려보기 위해 10가지 정도의 데이터를 담은 Array를 만들고 이를 ForEach를 사용하여 하나씩 나타나게 하는 과정에서이 경고를 접하게 되었다. ForEach(0.. 이것처럼 범위에 count 또는 indices 를 사용한 사람들은 이 경고를한 번쯤은 보았을 것 같다.1. 문제 상황위 코드처럼 ForEach문에서 범위에 count 또는 indices를 사용했을 때 이 경고를 접하게 되었다. 변하지 않는 값인 상수 범위가 사용되지 않았기 때문이다. count, indices는 데이터의 추가 또는 삭제가 발생함에 따라 충분히 변할 수 있는 값이기에 문제가 되는 것이다. 2. 이 Warning을 무시했을 때 문제가 발생하는 경우이는 어디까지나 Warning이기에 일단 뷰는 잘 나타난..