본문 바로가기

Swift

(53)
some SwiftUI에서 자주 보이는 친구입니다 .. Overview struct MyFirstView: View { var body: some View { Text("Hello world!") } } 이렇게 SwiftUI에서 자주 보이는 some이라는 키워드가 있습니다. some 키워드는 Swift 5.1에서 새로 나타난 기능인데 무엇인지 알아보도록 하겠습니다. And the some keyword that we use here is a switch feature that lets swift infer out inter return type automatically. (= some 키워드는 리턴 타입을 자동으로 그리고 빠르게 추론할 수 있는 스위치 기능입니다.) some 키워드는 Swift 5.1의 새로운 기..
Any/AnyObject 타입 캐스팅의 연장선으로 알면 좋을 개념입니다. Any/Any Object 타입 캐스팅을 수행할 때 일반적으로 상속 관계에 있는 클래스끼리만 캐스팅이 가능하지만, Any와 AnyObject 타입을 사용할 경우 상속 관계에 있지 않아도 타입 캐스팅을 할 수 있습니다. 상속 관계에 있을 때 Up Casting(=as)와 Down Casting(= as? as!)을 할 수 있습니다. 그리고 앞서 말한 것처럼 Any와 AnyObject 타입인 경우 상속 관계가 아니어도 타입 캐스팅을 할 수 있습니다. 먼저, Any와 AnyObject에 대해서 알아보도록 하겠습니다. Any : 모든 타입 모든 타입을 저장할 수 있도록 하는 것이 Any입니다. Swift는 타입에 민감한 언어입니다. 그래서 만약, Int형 배열을 ..
mutating mutating을 본격적으로 공부하기 위해서는 구조체에 대해서 제대로 알고 있어야 합니다. Swift에서 클래스는 참조 타입이고 구조체, 열거형은 값 타입입니다. 값 타입인 구조체에서는 인스턴스 메소드 내에서 프로퍼티들을 수정할 수 없게 되어 있습니다. 따라서, 이러한 프로퍼티들은 구조체 안의 메소드에서 수정을 해주기 위해 mutating이라는 키워드를 사용하게 됩니다. mutating 특정 메소드 내에서 구조체 또는 열거형의 프로퍼티들을 수정해야 하는 경우, 해당 메소드의 동작을 변경하도록 하는 것 간단한 코드를 통해서 알아보도록 하겠습니다. struct Person { let name: String var age: Int init(name: String, age: Int) { self.name = n..
Generic 제너릭 == 범용 타입 제너릭 코드는 유연하게 작성할 수 있고 재사용 가능한 함수와 타입이 어떤 타입과 작업할 수 있도록 요구사항을 정의합니다. 제너릭을 사용하면 중복을 피하면서 의도를 명확하게 표현하고 추상적인 방법으로 코드를 작성할 수 있습니다. Swift에서 가장 강력한 기능 중 하나로 Swift 표준 라이브러리 대다수는 제너릭 코드로 만들어졌습니다. Swift의 배열과 딕셔러니 타입은 제너릭 타입이며 Int 값을 갖고 있는 배열, String 타입을 갖고 있는 배열 .. 또는 다른 타입으로 배열을 만들 수 있습니다. 그리고 이러한 타입의 제한은 없습니다. Generic 제너릭이란, 타입에 의존하지 않는 범용 코드를 작성할 때 사용합니다. 제너릭을 사용하면 중복을 피하고 코드를 유연하게 작성할 수 ..
atomic VS nonatomic atomic atomic의 사전적인 정의는 '중단되지 않는'을 의미합니다. atomic : an operation appears to occur at a single instant between its invocation and its response 즉, atomic 하다는 것은 프로그래밍에서 데이터의 변경이 한 번에 일어난 것처럼 보이게 하는 것을 의미합니다. 데이터의 값을 변경하는 작업은 반드시 값 변경하는 시간이 필요합니다. atomic 한 데이터는 이러한 값 변경 시간이 0초인 것처럼 느끼게 합니다. 다시 말해서, 데이터의 값에 접근하는 여러 데이터 소비자(= 프로세스, 스레드)의 관점에서 데이터 값 변경에 걸리는 시간이 0초인 것처럼 느끼게 하는 것입니다. 이러한 일이 가능한 이유는 다음과 같..
Initialization - 구조체/클래스 초기화 Initialization class, structure, enumeration과 같은 named type의 stored property의 값을 초기화하는 것입니다. Structure Initialization 예를 들어 아래와 같은 구조체 Pet을 정의하겠습니다. struct Pet { } Default Initializer let myPet = Pet() Pet에는 아직 이니셜라이저가 정의되어 있지 않지만, 자동으로 default initializer가 사용됩니다. 만약 사용하고자 하는 타입이 저장 프로퍼티가 없거나 모든 저장 프로퍼티의 기본 값이 있다면 기본 이니셜라이저를 사용할 수 있습니다. 구조체 Pet에 몇가지 저장 프로퍼티를 만들어보겠습니다. ⬇️ struct Pet { let name: S..
Initialization - 그 외 실패 가능한 초기자 초기화 과정 중에서 실패할 가능성이 있는 초기자를 init 뒤에 물음표를 통해 실패가 가능한 초기자라고 표시할 수 있습니다. ✔️ 초기자는 이름이 따로 있는 것이 아니라 파리미터로 구분하기 때문에 실패 가능한 초기자와 실패 불가능한 초기자를 같은 파라미터 타입과 이름으로 동시에 사용할 수 없습니다. 실패 가능한 초기자는 반환값으로 옵셔널 값을 생성합니다. 초기화에 실패하는 부분에서 nil을 반환하여 초기화가 실패했다는 것을 알 수 있습니다. ✔️ 엄밀히 말하자면 초기자 init은 값을 반환하지 않습니다. 그래서 비록 nil을 반환하는 return nil 코드에는 사용되지만 init이 성공한 경우 return 키워드를 사용하지 않습니다. 아래의 코드는 숫자형을 위해 정의되어 있는 실패 ..
Initialization - 상속과 초기화 클래스 상속과 초기화 모든 클래스의 저장 프로퍼티와 부모 클래스로부터 상속받은 모든 프로퍼티는 초기화 단계에서 반드시 초기값이 할당되어야 합니다. Swift에서는 클래스 타입에서 모든 프로퍼티가 초기 값 할당을 보장하기 위해 2가지 방법을 지원합니다. 지정 초기자와 편리한 초기자 ✔️ 지정 초기자는 클래스의 주초기자입니다. 지정 초기자는 클래스의 모든 프로퍼티를 초기화합니다. 클래스 타입은 반드시 1개 이상의 지정 초기자가 있어야 합니다. ✔️ 편리한 초기자는 초기화 단계에서 미리 지정된 값을 사용해서 최소한의 입력으로 초기화를 할 수 있도록 도와줍니다. 편리한 초기자 내에서 반드시 지정 초기자가 호출되어야 합니다. 지정 초기자의 문법 지정 초기자의 문법은 값 타입 초기자와 같습니다. init(param..