일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Swift 문법
- 네이버 치지직
- swift문법
- 제앱소
- 애플 디벨로퍼 아카데미
- 숭실대
- StateObject
- 데이터베이스 공부
- global soop
- Apple Developer Academy @ POSTECH
- react
- 애플 디벨로퍼 아카데미 21주차 회고
- SWIFT
- 치지직
- 앱 비교 프로젝트
- apple developer academy 후기
- OS
- 소프트웨어분석및설계
- 운영체제
- ObservedObject
- sqoop
- 네이버 부스트캠프
- Swift 디자인패턴
- Swift 기능
- ObservableObject
- 애플 디벨로퍼 아카데미 후기
- iOS 개발 오류
- 애플 아카데미 후기
- useReducer
- 데이터베이스
- Today
- Total
목록전체 글 (290)
사과하는 제라스
zip은 보통 우리는 파일을 압축시킨 확장자로 많이들 알고 있다. 이랑 비슷한데 zip을 활용하면 두 배열을 순서대로 연결지어 하나의 것으로 압축시켜서 활용할 수 있다. 다음 코드를 보도록 하자. import UIKit //let friends = ["영희", "철수", "존슨", "제임스"] //let pets = ["야옹이", "댕댕이", "찍찍이"] // //let friendAndPetPairs = zip(friends, pets) // // //for aPair in friendAndPetPairs { // print("\(aPair.0), \(aPair.1)") //} let friends = ["영희", "철수", "존슨", "제임스"] // 이렇게 하면 friends의 길이에 맞게 연결된다..
Equatable 프로토콜이란? Equatable 프로토콜은 주어진 타입 간의 동일한 데이터를 가지는지 비교 연산을 구현하도록 하는 규약이다. 코드로 이해하는 Equatable 프로토콜 다음 코드를 보도록 하자. import UIKit struct Pet : Equatable{ let id: String let name: String static func == (lhs: Pet, rhs: Pet) -> Bool { return lhs.id == rhs.id } // 사실 !=는 안적어도 된다. Equatable을 준수하면 !=는 ==의 반대 결과로 알아서 적용된다. static func != (lhs: Pet, rhs: Pet) -> Bool { return lhs.id != rhs.id } } let ..
reduce를 활용하면 주어진 콜렉션 타입 내 모든 요소에 대해 연이은 작용을 할 수 있다. 뭔 소리야...? 그냥 예를 들면, 1. 배열 내 모든 값을 더하고 싶을 때 2. 배열 내 모든 값을 곱하고 싶을 때 등등 코드로 보자. let nums = [1,2,3,4,5,6,7,8,9,10] // 이런 숫자 list 내 모든 원소를 더하고자 하면 보통 for문을 써서 모든 값을 더한다. var sum = 0 for num in nums { sum += num } print(sum) 하지만 이런 for문 말고 reduce를 쓰면 원큐에 모든 값에 대한 작업을 적용할 수 있다. 방법1. let numberArray = [1,2,3,4,5,6,7,8,9,10] let sum = numberArray.reduce..
디자인 패턴은 정말 많다. 참조 github: https://github.com/ochococo/Design-Patterns-In-Swift#-builder 이렇게 크게 Behavioral, Creational, Structural 파트에서 여러가지 패턴들이 존재한다. 여기서 내가 들어본 건 Singleton 패턴 뿐이긴 하다. 이번에 공부한 패턴은 Creational 즉, 생성 시의 디자인 패턴 중 하나인 Builder 패턴이다. 먼저, 코드를 보면 다음과 같이 예시를 둘 수 있다. import UIKit // 일단 이런 Pet 모듈이 있다. struct Pet { var name: String? = nil var age: Int? = nil init(){} init(builder: SecondPetB..
이건 뭘까? 우리는 클로저를 매개변수로 받아오는 함수를 구현하기도 하는데... 이때, 만약 여러개의 클로저를 넣는다면 클로저를 넣는 것을 간략하게 줄여서도 쓸 수 있다. 다음 코드를 보면 바로 이해가 갈 것이다. 일단, 하나의 클로저 매개변수를 갖는 함수는 이렇다. // 우리는 보통 이런 식으로 클로저를 함수의 매개변수로 쓴다. func someFunction(completion: () -> Void){ print(#fileID, #function, #line, "- ") completion() } // 이걸 호출 시엔 이렇게 담아주면 되는데 someFunction(completion: { print(#fileID, #function, #line, "- hohoho 1") }) // 이걸 줄이면 이렇게도..
Codable은 무엇일까? -> Encodable과 Decodable을 합친 프로토콜이다. 그럼 걔네는 뭔데?? - Decodable은 JSON을 일반 값들로 추출된 객체 - Encodable은 JSON으로 변환된 객체 일단 예시로 보자. import UIKit let jsonFromServer = """ { "name": "윤동주" "job": "대학생", "nickname": "Xerath", } """ // de code = 제이슨을 클래스, 스트럭트로 바꾸기 // en code = 제이슨으로 만들기 //EnCodable & Decodable struct User : Decodable { var nickname: String? var job: String var myUserName: String /..
딕셔너리 그룹핑을 해보자. 일단 Collection 타입 중 하나인 Dictionary에 대해서 특정 요소를 기준으로 그룹핑을 해줄 수가 있다. 사용법은 다음 예시를 통해보자. import UIKit struct Friend{ var name: String var school: String } let friends = [ Friend(name: "김도영", school:"기아고등학교"), Friend(name: "박찬호", school:"기아고등학교"), Friend(name: "최원준", school:"기아고등학교"), Friend(name: "문동주", school:"한화고등학교"), Friend(name: "문현빈", school:"한화고등학교"), ] let schoolFriends = Dicti..
map을 공부하다가 보니 compactMap이란 것을 알게 되었다. 우리가 늘 상 쓰는 map은 nil을 포함하는 collection타입(배열, set 등등)에 대해서 적용 시 nil의 경우엔 따로 unwrapping도 해줘야 하고 처리를 해줄 필요가 있다. 하지만 compactMap을 쓴다면 nil인 요소들은 건너뛰어주고, unwrapping도 스스로 적용해서 optional한 collection에 대해 unwrapping이 되어 나오기에 편리하다. 다음을 보도록 하자. import UIKit arr = ["hello", "hi", nil, "ok"] arr.map{ print($0+"라고 말했다.") } 이럴 경우 에러가 뜬다. String?이기에 unwrapping이 필요하다. import UIKi..
class func와 static func는 기존의 func와 달리 메모리에 올리지 않고서 사용이 가능하다. 즉, 따로 객체를 만들고 해당 객체를 통해서 func를 쓰지 않고 바로 class를 통해 접근이 가능하다. 다음을 보자. class Say { // class func의 사용 class func hello(){ print("say hello") } // static func의 사용 static func hi(){ print("say hi") } } 엥? 그럼 둘 다 똑같은 거면 왜 따로 씀? 스택 오버플로우에서 검색해본 결과 이것처럼 static func는 사실상 class func지만 final 즉, 오버라이드가 불가능한 class func다. 이 부분이 둘의 차이이고, 또 다른 정보로는 str..
고차함수가 뭘까? 일단, 고차함수는 다른 함수를 매개변수로 받거나 함수 실행의 결과를 함수로 반환하는 함수다. 코드를 한번 보자. // 이런 함수가 있다고 하자. func getName(_ name: String) -> String { return "내 이름은 \(name)" } // 이 함수를 클로저 형태로 보면 이런 식으로 될 것이다. var getNameClosure : (String) -> String // sayHello라는 함수를 만들고 해당 함수에는 매개변수로 클로저를 두자. 여기에는 나중에 getName이란 함수를 넣어볼 거다. func sayHello( getName: (String) -> String, name: String) -> String { return getName(name) ..