브래의 슬기로운 코딩 생활
iOS 프로그래밍 실무 중간고사 정리 본문
변수 선언시 뒤에 쓰는 자료형 = 타입 어노테이션
묵시적 형변환 = 타입 추론
튜플: 여러 값을 하나의 개체에 일시적으로 묶는 방법
튜플의 요소는 서로 다른 형일수 있음
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()이 있다면 인스턴스를 초기화 하지 않아도 된다.
클래스 메소드
타입 메소드는 인스턴스 메소드와 동일한 방법으로 선언하지만 class나 static 키워드를 앞에 붙여서 선언한다. 타입 메소드 또는 클래스 메소드는 클래스 레벨에서 동작
- 호출: 클래스명.클래스 메소드()
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
- View에 Table View를 드래그하여 추가
- Pin Tool로 Add New Constraints : Table View를 화면 전체를 채움
- Assistant editor를 키고 ViewController 클래스에 테이블 뷰를 컨트롤 키를 누른 상테에서 소스의 클래스 안쪽으로 드래그
- Table View outlet 설정 : table
- ViewController.swift를 열어 UITableViewDelegate와 UITabeViewDataSource채택
- 준수하지 않는다고 오류가 뜨면 Fix클릭
- numberOfRowsInSection 함수에 Row 개수를 return
numberOfSection 함수도 생성후 원하는 섹션 개수를 리런 (없으면 자동으로 1로 리턴)
- cellForRowAt 함수에 let cell = UITableViewCell.init(style:...)을 선택 후 편집
style은 default, 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
- View에 Table View를 드래그하여 추가
- Pin Tool로 Add New Constraints : Table View를 화면 전체를 채움
- Assistant editor를 키고 ViewController.swift 파일에 테이블 뷰를 컨트롤 키를 누른 상태에서 소스의 클래스 안쪽으로 드래그 / Table View outlet 설정 : table
- ViewController.swift를 열어 UITableViewDelegate와 UITabeViewDataSource채택
- 준수하지 않는다고 오류가 뜨면 Fix클릭
- numberOfRowsInSection 함수에 Row 개수를 return
numberOfSection 함수도 생성후 원하는 섹션 개수를 리런 (없으면 자동으로 1로 리턴)
- View에 Table View Cell도 드래그 하여 추가
- TableView Content가 Dynamic Prototypes인지 확인
cell의 identifier추가: myCell
Cell을 관리할 swift파일 만들기 : Cocoa Touch Class선택
MyTableViewCell 클래스 만들기 /[Subclass of:] 부분에 부모 클래스로 UITableViewCell 먼저 지정 / Class명 : MyTableViewCell / [Create]클릭
Identity inspector의 class부분 콤보 박스 아래쪽 방향 화살표를 누르면 MyTableViewCell 선택 가능
myCell의 content view에 Label추가하고 Constraints설정 / Add 4 constraints
Assistant editor를 키고 MyTableViewCell.swift파일의 클래스 안에 label의 outlet지정 : 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 라는 문장을 써준다
'2-1 > iOS프로그래밍 실무' 카테고리의 다른 글
iOS프로그래밍 실무 10주차 정리 (0) | 2023.05.10 |
---|---|
iOS프로그래밍 실무 9주차 정리 (2) | 2023.05.03 |
iOS 프로그래밍 실무 7주차 정리 (0) | 2023.04.19 |
iOS프로그래밍 실무 6주차 정리 (0) | 2023.04.12 |
iOS프로그래밍 실무 5주차 정리 (0) | 2023.04.05 |