본문 바로가기

분류 전체보기640

값 타입과 참조 타입( 클래스와 구조체 ) 값 타입(Value) 데이터를 전달할 때 값을 복사하여 전달하는 것 즉, 전달 받은 값을 변경해도 원본 값은 영향을 받지 않는다. 값타입의 예시) 열거형 구조체 배열 문자열 딕셔너리 튜플 따라서 구조체 또는 열거형은 값 타입이다. 값 타입 속성은 기본적으로 인스턴스 메서드 내에서 수정할 수 없기 때문에 "mutating" 키워드를 작성한다. 참조 타입(Reference) 데이터를 전달할 때 값의 메모리 위치를 전달하는 것 즉, 전달 받은 값을 변경하면 원본 값도 변경된다. 참조 타입의 예시) 클래스 클로저 함수 2022. 6. 1.
클로저 (꼼꼼한 재은 씨의 Swift : 문법편 + babbab2) ㅇ출처: 꼼꼼한 재은 씨의 Swift : 문법편 + babbab2티스토리 클로저는 함수에 대해서 알고 배우는 편 좋기때문에 함수를 다 이해하고 살펴보자. Closure 란? 클로저란 보통 익명의 함수, 일회용 함수를 작성할 수 있는 구문이다. 이전에 배운 함수또한 클로저에 속한다. 무슨 말이냐면 클로저는 아래의 사진과 같이 두 종류의 클로저가 있다. 위의 사진에서 Named 클로저는 우리가 앞서 배운 아래의 코드와 같은 함수이다. (클로저이지만 그냥 함수라고 부를 뿐이다.) func doSomething() { print("Somaker") } 그리고 Unnamed 클로저는 앞으로 배울 Closure를 뜻한다. let closure = { print("Somaker") } Swift에서 클로저라고 부르는.. 2022. 5. 26.
함수(2) (꼼꼼한 재은 씨의 Swift : 문법편) 일급 객체로서의 함수 Swift는 함수형 패러다임을 따르고 있다. 즉, Swift라는 언어는 일급 객체에 부합하는 언어이다. 일급 함수의 특성 1. 객체가 런타임에도 생성이 가능해야 한다. 2. 인자값으로 객체를 전달할 수 있어야한다. 3. 반환값으로 객체를 사용할 수 있어야한다. 4. 변수나 데이터 구조안에 저장할 수 있어야한다. 5. 할당에 사용된 이름과 관계없이 고유한 구별이 가능해야한다. 함수가 위 조건을 만족하는 프로그래밍 언어는 함수형 언어가 되며, 함수형 프로그래밍에서는 "함수가 일급 객체"가 될 수 있다. 아래의 몇가지 예시를 통해서 Swift가 왜 함수형 언어이고 왜 일급 객체인지에 대해서 알아보자. 일급 함수의 특성 (1) - 변수나 상수에 함수를 대입할 수 있다. 변수나 상수에 함수를.. 2022. 5. 26.
함수(1) (꼼꼼한 재은 씨의 Swift : 문법편) 사용자 정의 함수 사용자 정의 함수를 정의하는 형식은 다음과 같다. -기본적인 함수- func 함수이름(매개변수1: 타입, 매개변수2: 타입) -> 반환타입 { 실행내용 return 반환값 } -매개변수가 없는 함수- func 함수이름() -> 반환타입 { 실행내용 return 반환값 } -반환값이 없는 함수- func 함수이름(매개변수1: 타입, 매개변수2: 타입) { 실행내용 } 💡 함수이름 - +, -, *, / 과같은 연산자는 사용불가하다. 사용자 정의 함수를 정의한 예시를 살펴보자. -함수의 예시- //매개변수x 반환값x func printHello() { print("안녕") } //매개변수x 반환값o func sayHello() -> String{ let value = "안녕" return .. 2022. 5. 25.
Bars - Tab Bars Tab Bars 탭바는 앱화면 아래 나타나 앱의 다른 섹션으로 빠르게 이동할 수 있게 도와준다. 탭바는 기본적으로 투명하나 배경 색상값을 가질 수도 있으며, 화면의 어떤 모드(가로/세로)에도 동일한 높이를 유지하고, 키보드가 나왔을 땐 가려진다. 탭바는 어떤 수의 탭도 포함할 수 있긴 하지만, 탭은 기기 크기나 모드에 따라 보여지는 탭의 개수가 달라진다. TIP💡 둘 다 앱화면의 아래에 나오기 때문에 탭바와 툴바의 차이를 알아두는 것이 좋다. 탭바는 앱의 다른 섹션으로 이동할 수 있게 한다. 반면 툴바는 현재 맥락과 관련된 액션을 수행하기 위한 버튼을 포함한다. 아이템을 삭제하거나 만들고, 주석을 추가하거나 사진을 찍는 것이다. 탭바와 툴바는 절대 같은 화면에서 함께 나오지 않는다. 탭바는 앱 수준에서의.. 2022. 5. 25.
Bars - Navigation Bars Navigation Bars 네비게이션 바는 앱 화면의 최 상단, 상태 바의 아래에 위치한다. 새로운 화면이 나오면 뒤로가기 버튼이 네비게이션 왼쪽에 보이게된다. 해당 버튼에는 이전 화면 라벨이 달려있다. (예를 들어 1번 화면에서 2번 화면으로 갔을 때 '< 1번화면' 이런 식으로) 또한 때때로 네비게이션의 오른쪽 부분에는 수정, 완료와 같은 컨트롤이 포함되어 있으며, 이를 통해 현재 보고있는 화면의 컨텐츠를 관리할 수 있다. 네비게이션 바는 반투명하고 배경 색상값을 조정할 수 있으며 키보드가 화면에 뜨거나 제스처 발생시, 혹은 뷰의 크키가 조정되었을 때 숨김처리 될 수 있다. 더 몰입감 높은 경험을 위해 일시적으로 네비게이션 숨겨보자. 예를 들어, 사진 앱에서 풀스크린 사진 뷰에서 네비게이션 바와 다.. 2022. 5. 25.
SnapKit 라이브러리의 정식 깃허브 주소는 여기이다. 왜 사용할까? Autolayout을 코드로 작성하려면 NSLayoutConstraint를 직접 지정해주며 하나하나 제약을 적용해 주어야한다. 이렇게 코드를 구성하면 복잡도는 올라가고 가독성은 떨어진다. 그렇기 때문에 SnapKit을 사용한다. 어떻게 사용할까? 1. SnapKit을 import 해주고 View를 만들어준다. import UIKit import SnapKit class ViewController: UIViewController { let box = UIView() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } }.. 2022. 5. 23.
방법2) 라이브러리 가져오기 - SPM(Swift Package Manager) Cocoa Pod을 두고 SPM을 이용하는 이유는 간단해서 그렇다. 하지만 장점이 있으면 단점도 있다. 단점은 지원하는 라이브러리가 많지 않다. 1. Project - TARETS - Frameworks, Libraries, and Embedded Content에서 + 를 클릭해준다. 2. Choose frameworks and libraries to add라는 팝업창이 뜨는데 여기서 하단 드롭박스 메뉴에서 Swift Package Manager를 선택 3. Choose Package Repository 라는 창에서 SPM을 지원하는 라이브러리를 주소를 입력후 Add Package를 누른다. 4. next 화면들에서 필요한 부분은 각자 체크하고 마무리 되면 Finish를 누른다. 2022. 5. 23.
방법1) 라이브러리 가져오기 - Cocoa Pod 1. 해당 프로젝트로 터미널 열기 2. pod init 해주기 pod init 3. 2번 과정으로 만들어진 pod file 열기 open -e podfile 4. 라이브러리 연결하기 podfile을 열고 pod '라이브러리 이름' 을 작성후 저장한다. pod 'SnapKit' # Uncomment the next line to define a global platform for your project # platform :ios, '9.0' target 'Project 01 - GoodAsOldPhones' do # Comment the next line if you don't want to use dynamic frameworks use_frameworks! # Pods for Project 01 - .. 2022. 5. 23.
터미널로 GitHub에 Commit하기 0. 커밋할 폴더 또는 파일을 우클릭하고 폴더에서 새로운 터미널 열기 클릭 1. Git 초기화 설정으로 git 버전관리 상태로 만들기 git init 2. 스테이징 - 폴더 또는 파일들을 gitdl 추척할 수 있게 올리는 것 git add . 3. GitHub에서 새로운 원격 저장소를 만들어 Git이랑 연결하기 a. GitHub ID 등록 git config --global user.name 본인ID b. GitHub E-mail 등록 git config --global user.email 본인email c. GitHub 저장소 연결 git remote add origin 본인 원격저장소 주소 4. Commit 하기 git commit -m "메세지 내용" 5. Psuh 하기 git push origin.. 2022. 5. 23.
원형 View 만들기 extension UIView { @IBInspectable var borderWidth: CGFloat { set { layer.borderWidth = newValue } get { return layer.borderWidth } } @IBInspectable var cornerRadius: CGFloat { set { layer.cornerRadius = newValue } get { return layer.cornerRadius } } @IBInspectable var borderColor: UIColor? { set { guard let uiColor = newValue else { return } layer.borderColor = uiColor.cgColor } get { guard let .. 2022. 5. 22.
익스텐션 (꼼꼼한 재은 씨의 Swift : 문법편) 익스익스텐션(Extensions)은 이미 존재하는 클래스나 구조체, 열거형 등의 객체에 새로운 기능을 추가하여 확장해주는 구문이다. 익스텐션을 통해서 구현할 수 있는 것들은 대표적으로 아래와 같다. 1. 새로운 연산 프로퍼티를 추가할 수 있다. 2. 새로운 메소드를 정의할 수 있다. 3. 새로윤 초기화 구문을 추가할 수 있다. 4. 기존 객체를 수정하지 않고 프로토콜을 구현할 수있다. (프로토콜은 다음편에서...) 이번편에서는 1 ~ 3까지만 다루어볼 예정이다. (4는 다음 편에) 익스텐션을 사용할 때는 아래와 같이 사용한다. extension { //code } 위의 형태에서 볼 수 있듯이, 익스텐션을 extension 키워드를 사용할 뿐 독립적인 객체를 생성하는 구문이 아니다. 따라서 익스텐션을 객체.. 2022. 5. 19.
SceneDelegate에서 특정 ViewController 보여지게 만들기 self.window?.rootViewController = UIStoryboard(name: "스토리보드 이름", bundle: nil).instantiateViewController(withIdentifier: "VC이름") 위의 코드는 특정상황에서 앱을 들어갈 때 다른 ViewController가 present 되도록 만들때 나오게 만든다. 2022. 5. 8.
DatePickerView 24h 설정하기 DatePickerView로 시간을 설정할 때 12시간짜리와 24시간 짜리를 설정하고 싶을 때가 있을 것이다. 대부분 12시간을 기본 값으로 한다. 하지만 이때 AM과 PM을 없애려면 어떻게 해야할까? DatePickerView - Attributes inspector - DatePicker - Locale - English(Gibraltar)를 설정해주면 24시간으로 설정된다. 2022. 4. 17.
시작하는 Storyboard 변경하기 1. 기존 MainStoryboard의 is Initial View Controller를 해제해준다. 2. 변경할 Storyboard를 생성하고 is Initial View Controller를 체크해준다. 3. Info파일에서 Main storyboard file base name과 Storyboard Name을 변경할 Storyboard 이름으로 변경해준다. 2022. 4. 17.
Multi Thread [Thread vs Multi - Thread] 1. Thread란 (작업의) 실 / 흐름 / 시퀀스이다. 2. Thread의 속성 연속성 흐름 자율성 독립성 지금은 위의 말이 무슨 말인지 와닿지 않을 수 있다. 앞으로 글을 읽다보면 이해가 될 것이다. 설명하기전 우리가 앱을 만드는 방식을 살펴보면 아래의 사진처럼 UI를 제작하고 Logic을 구성하고 UI 또는 Data를 업데이트할 것이다. 이 때 Logic 구성과 UI/Data 업데이트를 우리는 앞으로 Task(작업단위)로 칭할 것이다. 수업을 한 예시로 Thread를 표현하면 아래의 사진처럼 표현할 수 있다. 아래의 사진을 보면 어색한 부분이 있는데 그 부분은 수업과 필기가 따로 행해지고 있다는 것이다. 위의 표현처럼 수업이 진행된다고 하면 선생님이.. 2022. 4. 16.
Tabbar 관련 변경 폰트변경 AppDelegate - didFinishLaunchingWithOptions 에서 폰트 변경 코드를 입력한다. func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 탭바 폰트 설정 let appearance = UITabBarItem.appearance() let attributes = [NSAttributedString.Key.font:UIFont(name: "폰트 이름", size: 폰트사이즈)] appearance.setTitleTextAttributes(attributes as [NS.. 2022. 4. 16.
열거형 (꼼꼼한 재은 씨의 Swift : 문법편) 열거형이란 하나의 주제로 연관된 데이터들이 멤버로 구성되어 있는 자료형 객체를 말한다. 열거형에서 데이터들은 열거형 객체를 정의하는 시점에 함께 정의된다. 따라서, 데이터를 함부로 삭제하거나 변경할 수 없다. 삭제하거나 변경하려면 객체를 정의하는 구문을 직접 수정해야한다. 열거형의 데이터 멤버들은 정의 개념으로 작성되는 것이므로 타입으로 사용할 수 있을 뿐만 아니라 컴파일러가 미리 인지할 수 있다. 컴파일러가 미리 인지할 수 있고 없고의 차이는 런타임(Run - Time)오류와 컴파일 오류의 차이로 나타난다. 즉, 열거형을 이용하여 데이터 타입을 정의하고 사용하면 오타나 실수가 발생했을 때 그 즉시 컴파일러가 오류를 찾아주므로 잘못된 점을 바로 확인할 수 있다.(컴파일 오류) 하지만 집단 자료형을 사용해.. 2022. 4. 11.
User Interaction - 3D Touch 3D Touch 지원되는 디바이스에서 사람들은 터치스크린에 여러 단계의 압력을 주어 추가적인 기능에 접근할 수 있다. 앱은 Context menu (또는 peek and pop)에서 터치한 아이템에 사용할 수 있는 액션을 보여줌으로서 사용자에게 반응할 수 있다. iOS 13와 그 이후 버전의 기기에서 3D 터치 지원여부와 관계없이 사용자는 터치후 홀드 제스처를 사용하여 Context menu를 열 수 있다. 3D 터치를 지원하는 기기에서는 위 기능을 사용하면 Context menu가 더 빠르게 보여진다. Home Screen Interaction iOS 13과 그 이후 버전에서 홈스크린의 앱 아이콘을 터치 후 홀드하면 앱에선 Context menu를 보여줄 수 있다. (3D 터치 지원 기기에선 메뉴를 보.. 2022. 4. 11.
옵셔널과 옵셔널 체인 (꼼꼼한 재은 씨의 Swift : 문법편) 옵셔널 체인을 배우기전 옵셔널에 대한 기본적인 지식을 학습해보자. (출처) Swift에서는 프로그램의 안정성을 높이기 위해서 오류 대신 nil 값을 반환함으로써 개발자에게 문제가 있다는 사실을 알린다. 여기서 nil은 "값이 없음"을 의미한다. 그렇다면 옵셔널이란 무엇일까? 옵셔널이란 값이 없을 수도 있는 상황에서 사용한다. 이때 값이 없다는 것은 nil을 의미하는데 이 nil을 반환하기 위해 필요한 것이 옵셔널이다. 오직 옵셔널 타입만이 nil을 반환할 수 있다. 따라서 오류 발생의 가능성이 조금이라도 있으면 옵셔널로 정의해야 한다. 옵셔널 타입이란 무엇인가? 옵셔널은 nil이거나 nil이 아닌 값만 가질 수 있다. - nil: 실행 과정에서 오류가 발생했을 때 - nil이 아닌 값: 오류가 발생하지 .. 2022. 4. 10.
초기화 구문 (꼼꼼한 재은 씨의 Swift : 문법편) 구조체나 클래스는 모두 정의된 내용을 그대로 사용할 수는 없다. 항상 인스턴스를 생성해서 메모리 공간을 할당받은 다음에 사용해야한다. 이 과정을 바로 초기화라고 한다. 초기화 과정에서 가장 중요한 것은 저장 프로퍼티이다. 모든 저장 프로퍼티는 인스턴스 생성과정에서 초기화되어야하며 이를 위해서 반드시 초기값이 지정되어 있어야한다. 모든 저장 프로퍼티에 초기값이 지정되어 있다면 기본 초기화 구문을 사용하여 인스턴스를 생성할 수 있다. Resolution() Video() SUV() Car() Vehicle() 하지만 우리는 초기화를 배울때 위의 기본 초기화 구문말고 멤버와이즈 초기화 구문이라는 것을 배웠다. 이것은 구조체에서만 사용할 수 있는데 아래의 예제를 살펴보면서 다시 한번 이해해보자. struct R.. 2022. 4. 9.
타입 캐스팅 (꼼꼼한 재은 씨의 Swift : 문법편) 부모 클래스로부터 상속된 자식 클래스는 자기 자신의 타입이기도 하면서, 동시에 부모 클래스의 타입이기도 하다. 이는 부모 클래스의 특성들을 물려받았기 때문으로, 메소드를 오버라이딩했더라도 컴파일러가 클래스의 형태에서 중요하게 여기는 메소드의 이름, 매개변수의 타입 그리고 반환타입이 바뀌지 않는 한 클래스 형식이 달라진 것은 아니다. class Vehicle { var currentSpeed = 0.0 func accelerate() { self.currentSpeed += 1 } } class Car: Vehicle { var gear: Int { return Int(self.currentSpeed / 20) + 1 } func wiper(){ // 창을 닦는다. } } let trans: Vehicle.. 2022. 4. 9.
상속 (꼼꼼한 재은 씨의 Swift : 문법편) 클래스와 구조체의 구분되는 특성 중 하나로 상속(Ingeritance)이라는 것을 들 수 있다. 이는 말 그대로 하나의 클래스가 다른 클래스에게 무엇인가를 물려줄 수 있다는 말이다. 일반 사회 현상에서의 상속과 프로그래밍에서의 상속을 보면 아래와 같다. 일반 사회 - "아들이 아버지로부터 재산을 물려받았다." 프로그래밍 - "Child클래스가 Father클래스를 상속한다." 이 관계를 통해서 객체지향에서 상속을 정의하면 "한 클래스가 다른 클래스에서 정의된 프로퍼티나 메소드를 물려받아 사용하는 것" 과 같다. 상속을 사용하면 이미 만들어진 다른 클래스의 기능이나 프로퍼티를 직접 구현하지 않고도 사용할 수 있다. 다만, 추가로 필요한 기능이나 프로퍼티만 정의하여 사용하면 된다. 이때 기능이나 프로퍼티를 물.. 2022. 4. 3.
메소드 (꼼꼼한 재은 씨의 Swift : 문법편) 메소드는 일종의 함수로서, 클래스나 구조체, 열거형과 같은 객체 내에서 함수가 선언될 경우 말한다. 즉, 메소드는 특정 타입의 객체 내부에서 사용하는 함수라고 할 수 있다. 이 둘의 차이점은 구현 목적이 가는 독립성과 연관성에 있다. 함수는 독립적인 기능을 구현하기 위해서 만들어지는 것이지만, 메소드는 하나의 객체 내에 정의된 다른 메소드와 서로 협력하여 함수적인 기능을 수행한다. 메소드는 크게 인스턴스 메소드와 타입 메소드로 구분된다. 객체의 인스턴스를 생성해야 사용할 수 있는 인스턴스 메소드, 객체의 인스턴스를 생성하지 않아도 사용할 수 있는 타입 메소드이다. 따라서 인스턴스 메소드는 객체 타입 자체로는 호출할 수 없고 반드시 인스턴스를 생성한 후에 호출할 수 있다는 점에서 타입 메소드와 다르다. [.. 2022. 4. 2.
프로퍼티 (꼼꼼한 재은 씨의 Swift : 문법편) 아프로퍼티를 우리말로 번역하면 값을 저장하기 위한 목적으로 클래스와 구조체 내에서 정의된 변수나 상수라고 되어있지만 이는 프로퍼티가 하는 역할의 일부만 설명한 것이다. 프로퍼티의 역할은 클래스나 구조체에서 프로퍼티가 하는 정확한 역할은 값을 제공하는 것이다. 값을 제공하는 것과 저장하는 것은 어떤 차이가 있을까? 값을 저장하는 것이 아니라 제공하는것에 목적이 있다는 것은 프로퍼티중 일부는 값을 저장하지는 않지만 제공하는 특성을 가지고 있다는 것이다. 위에서 설명한거 처럼 프로퍼티에는 값을 저장x + 제공하는 것과 저장 + 제공하는 것이 있는데 이때 저장 + 제공하는 것을 저장 프로퍼티, 저장x + 제공하는 것을 연산 프로퍼티라고 한다. [저장 프로퍼티 vs 연산 프로퍼티] 저장 프로퍼티 1. 입력된 값을.. 2022. 3. 31.