Swift 64

[Swift] 맵, 필터, 리듀스

1️⃣ 맵 자신을 호출할 때 매개변수로 전달된 함수를 실행하여 그 결과를 다시 반환해주는 함수 기존 데이터를 변형하는데 많이 사용 map 매서드를 클로저 표현을 이용하여 간략화하기 let numbers: [Int] = [0, 1, 2, 3, 4] // 기본 클로저의 표현식 사용 var doubleNumbers = numbers.map({(number: Int) -> Int in return number * 2}) // 매개변수 및 반환 타입 생략 doubleNumbers = numbers.map({return $0 * 2}) print(doubleNumbers) // 반환 키워드 생략 doubleNumbers = numbers.map({ $0 * 2}) print(doubleNumbers) // 후행 클..

Swift 2022.03.22

[Swift] 옵셔널 체이닝과 빠른 종료 (guard, assert)

1️⃣ 옵셔널 체이닝? - 옵셔널에 속해있는 nil일지도 모르는 프로퍼티, 메서드, 서브스크립션 등을 가져오거나 호출할 때 사용할 수 있는 일련의 과정이다. - 옵셔널에 값이 있다면 프로퍼티, 메서드, 서브스크립트 등을 호출 - 옵셔널이 nil이라면 프로퍼티, 메서드, 서브스크립트 등은 nil을 반환 - 옵셔널을 반복사용하여 옵셔널이 자전거 체인처럼 서로 꼬리를 물고 있는 모양이기 때문에 옵셔널 체이닝이라고 부른다! 💡물음표(?) - 프로퍼티나 메서드 또는 서브스크립트를 호출하고 싶은 옵셔널 변수나 상수 뒤에 붙임 💡느낌표(!) - 옵셔널에서 값을 강제 추출하는 효과 - 옵셔널에 값이 없다면 런타임 오류가 발생 옵셔널 체이닝 간략하게 알아보기 // 사람의 주소 정보 표현 설계 class Room { va..

Swift 2022.03.20

[Swift] 클로저 : Closure

함수형 프로그래밍 패러다임과 클로저의 관계 - 스위프트에서 함수형 프로그래밍 패러다임을 접할 때 첫걸음으로 꼭 알아야할 클로저! - 클로저와 제네릭, 프로토콜, 모나드 등의 결합으로 스위프트는 훨씬 강력한 언어가 되었다. 함수와 클로저? - 함수는 클로저의 한 형태! 클로저? 변수나 상수가 선언된 위치에서 참조를 획득하고 저장할 수 있다. 이를 변수나 상수의 클로징(잠금)이라고 하며, 여기서 착안된 이름 '클로저' 클로저의 형태 1. 이름이 있으면서 어떤 값도 획득하지 않는 전역함수의 형태 2. 이름이 있으면서 다른 함수 내부의 값을 획득할 수 있는 중첩된 함수의 형태 3. 이름이 없고 주변 문맥에 따라 값을 획득할 수 있는 축약 문법으로 작성한 형태 1️⃣ 클로저의 표현방법 (위치를 기준으로) 1. 기..

Swift 2022.03.20

[Swift] 접근제어 : 읽기 전용 구현

💡접근제어의 필요성 객체지향 프로그래밍 패러다임에서 중요한 캡슐화와 은닉화를 구현하는 이유는 위부에서 보거나 접근하면 안 되는 코드가 있기 때문이다. 접근제어를 통해 꼭 필요한 부분만 제공할 수 있다. 💡읽기 전용 구현 설정자만 더 낮은 수준을 갖도록 제한할 수 있다. 요소의 접근수준 키워드 뒤에 접근수준(set)처럼 표현하면 설정자의 접근수준만 더 낮도록 지정해줄 수 있다. 설정자의 접근수준 제한은 프로퍼티, 서브스크립트, 변수 등에 적용될 수 있으며, 해당 요소의 접근수준보다 같거나 낮은 수준으로 제한해주어야한다. public struct SomeType{ // 비공개 접근 수준 저장 프로퍼티 count private var count: Int = 0 // 공개 접근 수준 저장 프로퍼티 publicS..

Swift 2022.03.19

[Swift] 함수를 사용한 프로퍼티 기본값 설정

함수를 사용한 프로퍼티 기본 값 설정 만약 사용자 정의 연산을 통해 저장 프로퍼티 기본값을 설정하고자 한다면 클로저나 함수를 사용하여 프로퍼티 기본 값을 제공할 수 있다. 인스턴스를 초기화할 때 함수나 클로저가 호출되면서 연산 결괏값을 프로퍼티 기본값으로 제공해준다. ( -> 타입이 일치해야함 ) 클로저가 실행되는 시점 - 초기화할 때, 인스턴스의 다른 프로퍼티 값이 설정되기 전! 즉, 클로저 내부에서는 인스턴스의 다른 프로퍼티를 사용하여 연산할 수 없다는 것이다. (self 프로퍼티, 인스턴스 메서드 등) 클로저를 통한 student 프로퍼티 기본 값 설정 struct Student{ var name: String? var number: Int? } class SchoolClass{ var studen..

Swift 2022.03.19

[Swift] self 프로퍼티 (feat. mutating, 타입메서드)

💡self 프로퍼티? 인스턴스를 더 명확하게 지칭하고 싶을 때 사용 스위프트는 자동으로 메서드 내부에 선언된 지역변수 -> 메서드 매개변수 -> 인스턴스 프로퍼티를 찾아 지정하는 것을 유추한다. 이때, self 프로퍼티를 사용하여 메서드에서 매개변수가 아닌 인스턴스 프로퍼티를 지칭할 수 있다. ➰self 프로퍼티의 다른 용도 값 타입 인스턴스 자체의 값을 치환할 수 있다. 클래스의 인스턴스는 참조 타입이라서 self 프로퍼티에 다른 참조를 할당할 수 없는데, 구조체나 열거형 등은 self 프로퍼티를 사용하여 자신 자체를 치환할 수 있다. ➰self 프로퍼티와 mutating 키워드 mutating 키워드 ? - 자신의 프로퍼티 값을 수정할 때 클래스의 인스턴스 메서드는 크게 신경쓸 필요가 없지만, 구조체..

Swift 2022.03.19

[Swift] 연산 프로퍼티로 가독성 높이기!

💡연산 프로퍼티? 실제값을 저장하는 프로퍼티가 아니라, 특정 상태에 따른 값을 연산하는 프로퍼티 메서드로 접근자와 설정자를 구현하던것을 연산 프로퍼티를 사용하면 코드의 가독성을 높일 수 있다! 다만, get 메서드만 구현해둔 것처럼 읽기 전용 상태로는 구현하기 쉽지만, 쓰기 전용 상태로는 구현할 수 없다는 단점이 있다. 연산 프로퍼티 정의와 사용 struct CoordinatePoint{ var x: Int // 저장 프로퍼티 var y: Int // 저장 프로퍼티 var oppositePoint: CoordinatePoint{ // 연산 프로퍼티 // 접근자 get { return CoordinatePoint(x: -x, y: -y) } // 설정자 set(opposite){ x = -opposite...

Swift 2022.03.19

[Swift] 구조체와 클래스

구조체의 인스턴스는 값 타입 (전달될 값이 복사되어 전달) 클래스의 인스턴스는 참조 타입 (값을 복사하지 않고 참조(주소)가 전달) 1️⃣ 구조체 // 구조체 정의 struct BasicInformation { var name: String var age: Int } // 구조체 인스턴스의 생성 및 초기화 // 프로퍼티 이름(name, age)으로 자동 생성된 이니셜라이즈를 사용하여 구조체를 생성 var yejinInfo: BasicInformation = BasicInformation(name: "yejin", age: 23) yejinInfo.name = "hyejin" // 변경 가능 yejinInfo.age = 25 // 변경 가능 // 프로퍼티가 상수 let 의 타입일 경우 변경 불가 ➰스위프트..

Swift 2022.03.17

[Swift] 옵셔널 : 옵셔널 추출

💡 옵셔널 단어 뜻 그래도 '선택적인', 즉 값이 '있을 수도, 없을 수도 있음'을 나타내는 표현 '변수나 상수 등에 꼭 값이 있다는 것을 보장할 수 없다.' 즉, 변수 또는 상수의 값이 nil일 수도 있다는 것을 의미 옵셔널 변수의 선언 및 nil 할당 var myName: String? = "yejin" print(myName) // yejin //옵셔널 타입의 값을 print 함수를 통해 출력하면 //Optional("yejin")이라고 출력되는 것이 정상 //다만, 차후의 주석표현의 편의를 위해서 //Optional()은 생략하고 값만 표기하도록 하겠다. //또, 옵셔널 타입의 값을 print 함수의 매개변수로 전달하면 //컴파일러 경고가 발생할 수 있다. //정상이므로 놀라지 않아도 된다. my..

Swift 2022.03.17

[Swift] 함수 : 입출력 매개변수 활용, 데이터 타입으로써의 함수, 중첩 함수, @discardableResult

🚫 공부하다가 기록해두면 좋겠다, 몰랐던 거다 싶은 내용을 위주로 정리했습니다. 1️⃣ 입출력 매개변수를 활용 값이 아닌 참조를 전달하려면 입출력 매개변수를 사용한다. 원래 값을 변경한다는 이야기! 1. 함수를 호출할 떄, 전달인자의 값을 복사합니다. 2. 해당 전달인자의 값을 변경하면 1에서 복사한 것을 함수 내부에서 변경합니다. 3. 함수를 반환하는 시점에 2에서 변경된 값을 원래의 매개변수에 할당합니다. var numbers: [Int] = [1,2,3] func nonReferenceParameter(_ arr: [Int]){ var copiedArr: [Int] = arr copiedArr[1] = 1 } func referenceParameter(_ arr: inout[Int]){ arr[1]..

Swift 2022.03.16