Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
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
Archives
Today
Total
관리 메뉴

브래의 슬기로운 코딩 생활

iOS 프로그래밍 실무 중간고사 정리 본문

2-1/iOS프로그래밍 실무

iOS 프로그래밍 실무 중간고사 정리

김브래 2023. 4. 22. 18:36

변수 선언시 뒤에 쓰는 자료형 = 타입 어노테이션

묵시적 형변환 = 타입 추론

 

튜플: 여러 값을 하나의 개체에 일시적으로 묶는 방법

튜플의 요소는 서로 다른 형일수 있음

 

let myTuple = (10, 12.1, "Hi")

var myString = myTuple.2

print(myString) // Hi

 

void는 빈 튜플 (empty tuple) / typealias Void = ()

 

함수(메서드)를 선언할 때 반환 값이 없으면 반환형을 지정할 필요 없음

그러나 함수, 메서드 또는 클로저의 형(type)에는 반환형 반드시 작성

 

단 한 줄의 코드로 튜플의 모든 값을 추출하여 변수 또는 상수에 할당

let myTuple = (10, 12.1, "Hi") ////과제 : myTuple의 자료형

let (myInt, myFloat, myString) = myTuple

 

튜플의 값을 선택적으로 추출하는 데 사용될 수 있으며, 무시하고 싶은 값에 밑줄을 사용하면 그 값은 무시

var (myInt, _, myString) = myTuple //12.1 무시

 

튜플을 생성할 때 각 값에 이름을 할당할 수도 있음

 

let myTuple = (count: 10, length: 12.1, message: "Hi") //과제 : myTuple의 자료형

 

튜플에 저장된 값에 할당된 이름은 각 값을 참조하는 데 사용

print(myTuple.message, myTuple.2) // Hi

 

튜플의 가장 강력한 점은 함수에서 여러 값들을 한 번에 반환하는 것

 

옵셔널: nil을 저장하기 위해 사용하는 타입

옵셔널 강제 언래핑 : 변수명 뒤 !

강제 언래핑의 단점: nil일 경우 크래시

옵셔널 바인딩: 옵셔널에 할당된 값을 임시 변수 또는 상수에 할당

if let constantName = optionalName{

//옵셔널 변수가 값이 있다면 언래핑해서 일반 상수 constantName에 대입하고 if문 실행

//값이 없다면 if문의 조건이 거짓이 되어 if문을 실행하지 않음

}

// 스위프트 5.7 버전부터는 if let 변수명 이라고 써도 된다.

!로 선언한 옵셔널 타입: 연산을 하는 등 옵셔널 값으로 쓰이지 않을 떄 암묵적으로 언래핑이 됨

 

Any: 범용 데이터타입

AnyObject: 범용 타입, 어떤 클래스의 객체도 저장 가능

 

++,-- 같은 연산자는 스위프트 3에서 사라짐

 

삼항 연산자 ?: / [조건] ? [참 표현식] : [거짓 표현식]

 

Nill합병연산자 (Nil-Coalescing Operator) ??

 

옵셔널변수 ?? nil일 때 할당되는 값

옵셔널 변수의 값이 nil이면 ?? 다음 값으로 할당됨

 

as 는 형변환에 사용 as!, as? 가 있음

 

부모인스턴스 as! 자식클래스 // downcasting 일반 타입으로 반환, 다운캐스팅이 반드시 성공할 것이라는 확신이 있을 때

부모인스턴스 as? 자식클래스 // downcasting 옵셔널 타입으로 반환. 확신이 없을 경우

 

함수 선언

func <함수명> (<매개변수 이름>: <매개변수 타입>, <매개변수 이름>: <매개변수 타입>,... ) -> <반환값 타입> {

// 함수 코드

}

 

클래스 선언하기

class 새로운 클래스 이름 : 부모 클래스 {

// 프로퍼티

// 인스턴스 메서드

// 타입(type) 메서드(클래스 메서드)

}

 

프로퍼티는

초기값이 있거나

init을 이용해 초기화하거나

옵셔널 변수로 선언하여 nil값으로 초기화 해야한다.

인스턴스를 만들고 메서드와 프로퍼티 접근

 

var 인스턴스명 : 클래스명 = 클래스명()

인스턴스.프로퍼티

인스턴스.인스턴스 메소드()

 

init() - 인스턴스 초기화 하기

init()을 하나라도 만들면 눈에 안보이는 default initializer은 없어지고,

이렇게 만든 init()designated initializer 라고 한다 // init()이 있다면 인스턴스를 초기화 하지 않아도 된다.

 

클래스 메소드

 

타입 메소드는 인스턴스 메소드와 동일한 방법으로 선언하지만 classstatic 키워드를 앞에 붙여서 선언한다. 타입 메소드 또는 클래스 메소드는 클래스 레벨에서 동작

- 호출: 클래스명.클래스 메소드()

 

Self

현재 클래스 내 매서드나 프로퍼티를 가리킬 때 메서드나 프로퍼티 앞에 self.을 붙임

매개변수와 이름이 같다면 구분하기 위해 반드시 써줘야함

 

failable initializer (실패 가능한 생성자: init?) - 이것으로 만든 인스턴스는 옵셔널 형으로 만들어져서 사용하려면 언래핑을 해야한다.(!도 가능)

 

method overloading : 생성자 중첩

매개변수의 개수와 자료형이 다른 같은 이름의 함수(생성자)를 여러 개 정의

 

Swift 상속

class 자식 : 부모 {

}

부모 클래스는 하나만 가능

콜론 다음이 여러 개이면 나머지는 프로토콜

 

상속은 클래스만 가능

 

super : 부모 메서드 호출 시 사용

 

override : 부모와 자식에 같은 메서드가 있으면 자식 우선

 

protocol 정의, 채택, 준수

 

protocol Runnable { //대리하고 싶은 함수 목록 작성

var x : Int {get set} //읽기와 쓰기 가능 프로퍼티,{get}은 읽기 전용

//property in protocol must have explicit { get } or { get set } specifier

func run() //메서드는 선언만 있음

}

class Man : Runnable { //채택, adopt

var x : Int = 1 //준수, conform

func run(){print("달린다~")} //준수, conform

}

 

옵셔널 체이닝 : 옵셔널 변수 뒤 ? : 옵셔널 변수의 속성에 접근할 때 언래핑을 할 때 Nill값이 나오면 크래시가 나므로 안전하게 다시 옵셔널 형으로 반환

class Person {

var name: String

var age: Int

init(name: String, age: Int) {

self.name

= name

self.age

= age

}

}

let kim: Person

= Person(name: "Kim", age: 20

)

print(kim.age)

let han: Person?

= Person(name: "Han", age: 25

)

print(han.age)

//print(han!.age)

// print(han?.age) //Optional(25), 옵셔널 체이닝

// print((han?.age)!)

// if let hanAge = han?.age {

// print(hanAge)

// } else {

// print("nil")

Xcode 화면구성: navigator, Document Outline, Canvas, inspector

 

테이블 뷰 실습

 

- file - new - project - [iOS]-[App] / Interface:Storyboard, Life Cycle:UiKit, Language:Swift

- ViewTable View를 드래그하여 추가

- Pin ToolAdd New Constraints : Table View를 화면 전체를 채움

- Assistant editor를 키고 ViewController 클래스에 테이블 뷰를 컨트롤 키를 누른 상테에서 소스의 클래스 안쪽으로 드래그

- Table View outlet 설정 : table

- ViewController.swift를 열어 UITableViewDelegateUITabeViewDataSource채택

- 준수하지 않는다고 오류가 뜨면 Fix클릭

- numberOfRowsInSection 함수에 Row 개수를 return

numberOfSection 함수도 생성후 원하는 섹션 개수를 리런 (없으면 자동으로 1로 리턴)

- cellForRowAt 함수에 let cell = UITableViewCell.init(style:...)을 선택 후 편집

styledefault, value1, value2, subtitle 4개가 있고 reuseIdentifier에는 셀의 아이디를 적는다

cell.textLabel?.text = “\(indexPath.row)” / return cell을 해준다.

- super.viewDidload 함수 아래 table.delegate = self, table.dataSource = self 라는 문장을 써준다

 

Table View Cell을 직접 디자인 : Table View Cell 추가

- file - new - project - [iOS]-[App] / Interface:Storyboard, Life Cycle:UiKit, Language:Swift

- ViewTable View를 드래그하여 추가

- Pin ToolAdd New Constraints : Table View를 화면 전체를 채움

- Assistant editor를 키고 ViewController.swift 파일에 테이블 뷰를 컨트롤 키를 누른 상태에서 소스의 클래스 안쪽으로 드래그 / Table View outlet 설정 : table

- ViewController.swift를 열어 UITableViewDelegateUITabeViewDataSource채택

- 준수하지 않는다고 오류가 뜨면 Fix클릭

- numberOfRowsInSection 함수에 Row 개수를 return

numberOfSection 함수도 생성후 원하는 섹션 개수를 리런 (없으면 자동으로 1로 리턴)

- ViewTable View Cell도 드래그 하여 추가

- TableView ContentDynamic Prototypes인지 확인

cellidentifier추가: myCell

Cell을 관리할 swift파일 만들기 : Cocoa Touch Class선택

MyTableViewCell 클래스 만들기 /[Subclass of:] 부분에 부모 클래스로 UITableViewCell 먼저 지정 / Class: MyTableViewCell / [Create]클릭

Identity inspectorclass부분 콤보 박스 아래쪽 방향 화살표를 누르면 MyTableViewCell 선택 가능

myCellcontent viewLabel추가하고 Constraints설정 / Add 4 constraints

Assistant editor를 키고 MyTableViewCell.swift파일의 클래스 안에 labeloutlet지정 : myLabel

ViewController.swift파일의 cellForRowAt 함수 안에 let cell = tableview.dequeueReusableCell 함수 추가 후 (withIdentifier : myCell, for : indexPath) as! MyTableViewCell 로 지정

cell.myLabel.text = indexPath.description; return cell

- super.viewDidload 함수 아래 table.delegate = self, table.dataSource = self 라는 문장을 써준다