Swift iOS11 앱 개발 - 1. iOS 11, Xcode 9와 Swift 4 소개

Bibi·2021년 9월 21일

Swift iOS11 앱개발 - (1) iOS 11, Xcode 9와 Swift 4 소개

https://www.edwith.org/swiftapp/lecture/26619/?isDesc=false

학습 목표

  • Xcode에 친숙해지고, 스토리보드에 UI 객체를 올릴 수 있다.
  • 스토리보드의 UI 객체를 코드와 연결하여 사용할 수 있다.

핵심 키워드

  • 스토리보드
  • 프로퍼티 감시자
  • 배열
  • 옵셔널

iOS 프로그래밍은 객체 지향적이다. 객체지향을 모르면 iOS 개발을 하기 어렵다.

What's in iOS?

이 강의에서는 코코아 터치, 코어 서비스 계층을 주로 다룬다.

1. Cocoa Touch

  • iOS의 UI 계층
  • 버튼, 슬라이더 등이 있는 계층
  • 지도 키트처럼 복잡한 객체도 있다

2. Media

  • 비디오, 오디오, 이미지 등을 담는 계층
  • 아이폰은 원래 아이팟에 전화 기능을 넣은 것이었다.

3. Core Service

  • 하위 서비스들의 최상위에 있는 객체지향적인 계층

4. Core OS

  • iOS는 BSD 계열 Unix이다.

  • c언어를 기반으로 한다.

    Platform Components

  • Tools : Xcode, Instruments

  • Language : Swift 또는 Objective-C

    • Swift 와 Objective-C 는 완전히 호환 가능하다.
    • 하지만 진정한 컴퓨터 과학자라면 새로운 언어를 배우는 것이 아무것도 아니어야 한다!
  • Frameworks : 여러 가지가 있지만, 그 중에서도..

    • 프레임워크는 단지 객체들의 집합이다.
    • Core Data, Core Motion, Map Kit ...
    • Foundation : Core Service에 관한 것들이 있는 곳.
    • UIKit : 가장 큼.
  • Design Strategy : MVC모델

    • iOS 개발 시 반드시 이렇게 개발해야 한다.

과제 : Swift 매뉴얼 읽기

  • Xcode 에서 디버거 사용하는 방법 배우기

Xcode 프로젝트 생성하기

Xcode의 화면 구성은 네비게이터, 편집기, 유틸리티로 구성되어 있다.

네비게이터

  • Xcode의 왼쪽 영역
  • 프로젝트를 탐색함
  • 디버깅 시 브레이크포인트를 줄 수 있음

편집기

  • Xcode 의 중간 영역

유틸리티 utility

  • Xcode 의 오른쪽 영역

Concentration 게임 만들기

콘솔 : 데이터를 출력해주는 기능. 디버깅에도 사용 가능

시뮬레이터 : 왼쪽 위 실행 가능한 버튼 - 각 아이폰, 아이패드 등 맥 기기들에서 시뮬레이션할 수 있다.

  • 해당 기기가 없어도 있는 것처럼 테스트 가능

재생 버튼 : 실행 버튼. 내가 만든 앱을 돌려볼 수 있다. 기기 버전을 선택해 실행한다.

  • 모든 버전의 기기에서 잘 작동하는 아이폰 앱을 만드는 것이 중요.

옵션 + 마우스 스크롤 시 UI 영역을 확대/축소할 수 있다

오브젝트 라이브러리 Object Library

UI 영역을 누른 뒤, Shift + Command + L

또는 오른쪽 위 중간쯤의 + 버튼.

버튼, 슬라이더, 라벨 등 앱 UI 구성에 필요한 요소들이 들어 있다.

UI에 원하는 항목을 드래그하여 사용함

UI 항목에 기능 연결하기

UI의 항목이 무엇을 하게 하려면..

  • ViewController.swift에 스위프트 코드를 연결하면 된다.

UIKit

  • iOS 프레임워크. 버튼과 슬라이더 등등이 있다.
  • 위에서 설명한 코코아터치 층 같은 것.

UIViewController

  • UIKit에 포함된, UI 제어를 맡은 클래스.
  • ViewController가 이 클래스를 상속받아 사용한다.

이 게임에서는 버튼을 누르면 어떤 메소드가 호출되어야 한다.

따라서

  • UI 와 코드를 한 화면에 띄운 뒤,
  • ctrl을 누른 채로 UI 의 버튼을 코드 영역에 드래그한다.

UI와 코드 연결 선택항목들

  • Connection : Action. 메소드와 비슷한 역할. 버튼을 눌렀을 때 메소드를 호출하도록 한다.
  • Name : 이 버튼의 역할을 기준으로 이름지으면 됨 (touchCard)
  • ❗️Type : 버튼이 해당 메서드를 호출하므로 UIButton 으로 선택해야 함
  • Event : Touch Up Inside. 버튼 안쪽이 터치되면 이벤트 발생
  • Argument : 인수(Argument)를 선택함 - 보내주는 버튼이 있어야 하므로 Sender로 선택

@IBAction : 메서드 첫 라인이 원형으로 바뀌며, 이 영역에 마우스를 올리면 UI의 어떤 부분에서 해당 메서드를 호출하는지 표시해 준다.

@IBAction func touchCard(_ sender: UIButton) {
  
}

스위프트가 다른 언어들과 다른 점 2가지

  1. 모든 인수에는 이름이 있다. 메소드를 호출할 때 이 이름을 포함해야 함
  2. 인수에는 두 개의 이름이 있다. 하나는 외부 이름(전달인자 레이블 Argument Label, 외부에서 호출할 때 사용), 하나는 내부 이름(매개변수 이름 Parameter Name, 내부에서 코드 구현에 사용)

Xcode 설정 - 결과가 출력될 때 콘솔창 자동으로 나오게 하기

Xcode > Behaviors > Edit Behaviors > Running > Generates Output 에서

Show debugger with Variables & Console View 체크 활성화하기.

✅ 메서드 변수명 짓기의 핵심

메서드 변수명을 지을 때 중요한 것은, 누군가 이 코드를 읽을 때 영어처럼 읽혀져야 한다는 것이다!!

예를 들어

func flipCard(withEmoji emoji : String, on button: UIButton) {} 함수가 있을 때

이를 호출할 때는

flipCard(withEmoji: "👻", on: sender) 로 작성하므로

"Flip card with emoji ghost on sender" 라고 영어처럼 읽을 수 있다.

func touchCard(_ sender: UIButton){} 처럼, 라이브러리에서 상속받은 클래스 메서드에 _를 사용하는 이유

다른 프로그래밍언어면 몰라도, Swift에서는 _ 를 거의 사용하지 않는다 (Argument Label 대신에)

우리도 코딩할 때에 Argument Label과 Parameter Name을 모두 붙여 주는 것이 좋다.

상속받은 클래스에 _ 가 있는 이유는, 몇몇 클래스들이 Objective-C에서 왔기 때문이며 Objective-C에는 Argument Label이라는 개념이 없기 때문임!

✅ Xcode에서 문서 참조하기 - Overview(도움말)

Option + 마우스 왼쪽 클릭

도움말이 나온다.

도움말에서 모르는 내용을 클릭하면 문서가 열리며 사용법을 참고할 수 있다.

모르는 메서드를 사용해야 할 때 사용법에 대해 그 문서를 볼 수 있다.

⭐️특히, 자주 사용하는 클래스의 Overview를 다 읽어보는 것을 강력 추천함!!

색상 리터럴 Color Literal

button.backgroundColor = Color 까지 입력하면 Color를 Color Literal 로 선택할 수 있다.

선택 시 네모가 생기며, 네모를 클릭해 화면으로 보면서 원하는 색상을 고를 수 있다.

카드 복사

: 이미 만들어 놓은 카드를 복사해 쓸 수 있다.

인터페이스 빌더에서 Command C V로 복사.

처음부터 새로 만드는 것보다 이미 만든 것을 복사하는 것이 효율적 (새로 설정할 필요가 업음)

⚠️ 자주 하는 실수

UI에서 요소를 복사하면, 요소에 연결된 메서드들도 함께 복사됨.

이는 의도하지 않은 동작 오류를 만들 수 있으니 주의해야 함!

복사된 설정을 수정하기 위해서는 UI에 오른쪽 클릭을 통해 설정을 바꿀 수 있음.

\()

print문에서 문자열 출력 시 사용 가능

소괄호 안에 넣은 대상을 문자열로 해석하고 그 문자열을 출력함

스위프트에서 대부분의 대상들을 이 기호로 출력 가능

카드를 몇 번 뒤집었는지 알려주는 UI 만들기

  • 카드를 몇 번 뒤집었는지를 저장하는 프로퍼티를 만든다.
    • 프로퍼티 = (스위프트에서의 )인스턴스 변수.
  • 모든 프로퍼티는 초기값이 반드시 필요하다.
    • 방법 1 : 이니셜라이저 만들기. 모든 변수를 초기화함
    • 방법 2 : 기본값 지정하기.
  • UILabel : iOS의 읽기 전용 텍스트필드.
    • 카드를 뒤집은 횟수를 보여주기 위해 사용할 것임.
    • 마찬가지로 오브젝트 라이브러리를 사용한다.
  • Label을 만들고, Label과 메서드를 연결
    • Connection : Outlet으로 설정.
      • Outlet : 프로퍼티(@IBOutlet)를 만듦.
      • Action : 메서드(@IBAction)를 만듦.
      • Outlet Collection : 배열(@IBOutlet))을 만듦. UI 에 있는 것들의 배열
    • 생성된 프로퍼티는 연결된 Label을 가리킨다 (point Label)

스위프트는 강한 타입 언어이다.

Swift is extreamly strongly typed language.

  • 타입이 없는 타입도 있긴 하지만, 이는 Obj-c와의 하위 호환성을 위한 정도일 뿐
  • 항상 어떤 타입을 사용할 것인지 분명하게 명시해야 한다.

대신 스위프트는 강한 타입 추론 언어이기도 하다.

  • 웬만한 경우에는 타입을 추론해 준다는 이야기이다.
    • var flipCount : Int = 0 이 아니라 var flipCount = 0 이라고만 적어도 괜찮은 이유이다
    • 소수점이 없는 숫자는 모두 Int로 취급하기 때문
  • 타입 추론이 잘 되는지 확인하기 위해서는 Option 키를 누르고 해당 변수를 클릭해 보면 된다.

❗️어떤 상황이든지 코드를 "복사 붙여넣기" 하는 것은 옳지 않다.

프로퍼티 감시자 Property Observer

모든 프로퍼티 뒤에는 didSet이라는 코드를 추가할 수 있다.

해당 프로퍼티가 변경될 때 마다 didSet 코드가 실행된다.

UI 와 프로퍼티의 싱크를 맞추기 위해 매우 자주 사용된다.

✅ 이름 바꾸기 Rename

: Command + 대상 클릭.

해당 변수를 사용하는 모든 지점을 찾아 함께 변경해준다.

상수

스위프트에서 변하지 않는 값은 반드시 상수(let)로 표기해야 한다.

변하지 않는 값인데 var로 표기하지 말아라. 절대!


옵셔널

옵셔널은 열거형으로 구현되어 있으며,

오직 두 가지 상태를 가지는 타입이다.

  • 설정된 상태 (Set)
  • 설정되지 않은 상태 (not Set)

또, 스위프트에서의 열거형은 각 경우마다 관련 데이터를 가질 수 있다.

열거형 : 불연속형 값들의 모음

  • 옵셔널이 설정된 상태(Set) 라면 관련 데이터를 가진다.

  • 옵셔널이 설정되지 않은 상태라면 nil이 된다.

nil : 스위프트에서 "설정되지 않은 옵셔널"을 의미함

옵셔널 값 가져오기 : 매우 중요

  • 옵셔널! : 해당 옵셔널이 설정된 상태라고 가정하고, 관련 값을 가져온다.
    • 값이 없을 때 사용하면 충돌이 일어난다.
  • if let 조건문 : 해당 옵셔널이 설정된 상태일 때만 관련 값을 가져온다.
    • 값이 없으면 가져오지 않는다. (else 도 사용 가능)

0개의 댓글